一、tcp和udp的區別?
一、TCP面向鏈接(如打電話要先撥號創建鏈接);UDP是無鏈接的,即發送數據以前不須要創建鏈接
二、TCP提供可靠的服務。也就是說,經過TCP鏈接傳送的數據,無差錯,不丟失,不重複,
且按序到達;UDP盡最大努力交付,即不保證可靠交付
三、TCP面向字節流,其實是TCP把數據當作一連串無結構的字節流;UDP是面向報文的
UDP沒有擁塞控制,所以網絡出現擁塞不會使源主機的發送速率下降(對實時應用頗有用,如IP電話,實時視頻會議等)
四、每一條TCP鏈接只能是點到點的;UDP支持一對一,一對多,多對一和多對多的交互通訊
五、TCP首部開銷20字節;UDP的首部開銷小,只有8個字節
六、TCP的邏輯通訊信道是全雙工的可靠信道,UDP則是不可靠信道
TCP三次握手過程:
第一次握手:客戶端(client)發送SYN包到服務器(server),
客戶端(client)狀態機進入SYN_SEND狀態,等待服務器確認;
第二次握手:服務器(server)接收到SYN包,必須發送ACK包到客戶端,
同時本身也發送一個SYN包,即SYN+ACK包,此時服務器進入SYN_RECV狀態;
第三次握手:客戶端(client)接收到服務器發送的SYN+ACK包,
必須向服務器發送確認包ACK,此包發送成功,則客戶端和服務器同時進入ESTABLISHED狀態。
3次握手的特色:
沒有應用層的數據
SYN這個標誌位只有在TCP建產鏈接時纔會被置1
握手完成後SYN標誌位被置0
TCP創建鏈接要進行3次握手,而斷開鏈接要進行4次
四次揮手:
假設客戶端發起斷開鏈接請求,
第一次揮手:客戶端(client)發送FIN報文到Server端
第二次揮手:服務器(server)收到客戶端發送的FIN包以後,發送ACK包到客戶端,
客戶端收到服務器發送的ACK以後,進入FIN_WAIT狀態,等待server端發送FIN報文
第三次揮手:服務器(server)發送FIN報文到客戶端
第四次揮手:客戶端收到服務器發送的FIN報文以後,發送ACK包到服務器,
服務器收到ACK以後即斷開鏈接,等待一段時間TIME_WAIT以後,
客戶端發現服務器沒有再發FIN過來,就知道服務器已經斷開鏈接,此時客戶端也進入斷開鏈接狀態。python
名詞解釋:
ACK TCP報頭的控制位之一,對數據進行確認.確認由目的端發出,用它來告訴發送端這個序列號以前的數據段都收到了.
好比,確認號爲X,則表示前X-1個數據段都收到了,只有當ACK=1時,確認號纔有效,當ACK=0時,確認號無效,這時會要求重傳數據,保證數據的完整性.
SYN 同步序列號,TCP創建鏈接時將這設置爲1
FIN 發送端完成發送任務位,當TCP完成數據傳輸須要斷開時,提出斷開鏈接的一方將這設置爲1數組
二、對內存中棧和堆的瞭解?
棧(stacks):棧的特色是後進先出。只能經過訪問一端來實現數據的儲存和檢索的線性數據結構。
a、棧的伸長和伸縮就是函數壓入或者推出局部變量。
b、咱們不用本身去管理內存,變量建立和釋放都是自動的。
c、棧中的變量只有在函數建立運行時存在。
堆:
堆也是咱們的計算機內存中的一個區域,可是他不是自動管理的。並且也不是被CPU密切的管理着。
它是一片更加自由的內存區域(很大)。要想在堆上建立內存,咱們必須使用malloc() 或者calloc(),
他們都是C語言編譯的。一旦你在堆上分配內存,當你不在須要的時候你必須用free()去銷燬。若是你不銷燬或者銷燬失敗,
你的程序就會有內存泄露。換句話說就是堆內存會一直在,其餘進程沒法使用。
不像棧,堆沒有變量大小的限制(除了你電腦的物理限制條件外)。堆內存讀出和寫入都比較慢,由於它必須使用指針圖訪問堆內存。
服務器
棧和堆的優缺點:
棧:
a、快速訪問。
b、沒有必要明確的建立分類變量,由於它是自動管理的。
c、空間被CPU高效地管理着,內存不會變成碎片。
d、只有局部變量
e、受限於棧大小(取決於操做系統)
f、變量不能調整大小。
堆:
a、變量能夠被全局訪問
b、沒有內存大小限制
c、(相對)訪問比較慢
d、沒有高效地使用空間,隨着塊內存的建立和銷燬,內存可能會變成碎片。
e、你必須管理內存(變量的建立和銷燬你必需要負責)
f、變量大小能夠用realloc( )調整網絡
3.字典、列表查詢時的時間複雜度是怎樣的?
列表是序列,能夠理解爲數據結構中的數組,字典能夠理解爲數據結構中的hashmap,python中list對象的存儲結構採用的是線性表,
所以其查詢複雜度爲O(n),而dict對象的存儲結構採用的是散列表(hash表),其在最優狀況下查詢複雜度爲O(1)。dict的佔用內存稍比list大,
會在1.5倍左右。
四、遞歸中若是沒有終止條件會怎樣?
遞歸若是沒有終止條件會致使遞歸調用成爲死循環而不能正常結束,而且會形成棧溢出數據結構
5.去除列表中的重複元素
list1 = [12,12,13,14,15,6,7,6,8,9,3,3,13]app
# list1 = list(set(list1))
# print(list1)
def distinct_list(list):
d_l = []
for i in list1:
if i not in d_l:
d_l.append(i)
return d_l
ret = distinct_list(list1)
print(ret)tcp