TCP的一些簡單記錄

主要是記錄一下,自己對於所瞭解的一些知識點。


所以上一個tcp報文段的包頭的結構吧。




一個個解釋吧

源端口號,目的端口號,2byte一個,這個顯而易見,就不多說了。(那麼源IP,目的IP呢?那是網絡層的事呢,由IP協議負責將這些信息封裝進報文段中,成爲數據報)


序號和確認號一起說明,它們2個合夥用來實現可靠數據傳輸。首先當我們創建套接字socket的時候第二個參數還記得麼,當我們創建tcp 套接字的時候,用的參數是SOCK_STREAM, 流式套接字(其實也就是運輸層採用tcp協議啦)!   tcp把數據看成一個無結構但是有序的流,序號就是該報文段的數據的首個字節的編號。

那麼確認號呢? TCP是全雙工的,即它們之間是互相發送數據的,A發一個報文段給B,B收到後返回一個報文段給A,B返回給A的報文段中的確認號的值就是B希望從A接收到的下一字節的序號。

比如說A發送給B的報文段中,序號是90,數據共20個byte,如果B成功接收,那麼返回給A的確認號是90+20=110。

待會說到三次握手(建立TCP連接)的時候,會更明白一點。

首部長度,這個跟udp包頭的長度不同,這裏的首部長度是一個byte,描述的是tcp的包頭的長度。

保留未用,沒啥好說的。

URG,ACK,PSH,RST,SYN,FIN,共6bit的標誌位,各有各的作用。

URG,urgen,緊急的,這是緊急標記位,表示該報文段中存在緊急的數據,結合緊急數據指針一起使用,緊急數據指針,指向的是緊急數據的最後一個byte。

ACK,用來表示確認號字段中的值是有效的,表示該報文段包含一個對已接受的報文段的確認。

PSH,指示接收方應該立即將數據交付給應用層。

RST,SYN,FIN 這三個主要用於TCP連接的建立和關閉。


接收窗口,用於流量控制,用於指示接收方願意接受的字節數量,該字段的值越大的時候,理論上傳輸速度會越快(TCP有相應的策略調整它的值,用於流量控制)。


互聯網檢驗和,提供差錯檢測,我不清楚當tcp報文段出現比特差錯的時候 是否有辦法自我修復,或者還是做其它處理(如丟棄)如果有看官知道的話提醒我一下。


選項:12個byte,窗口調節因子,裏面還定義了一個時間戳選項(選項具體有什麼作用我也還不清楚)


三次握手

有客戶端發起

客戶端爲A

服務端爲B

首先A給B發送一個SYN報文段,即將SYN標誌位置1,假設該報文段的序號是30,確認號是50,數據共一個字節。

那麼B將給A發送一個SYN ACK 報文段,該報文段中,序號是50,確認號是31,假設數據是5個字節。

這時A將發送一個ACK報文段(此報文段SYN爲0,沒有置1)返回給服務器,告訴服務器已經接收到數據,此時3次握手結束,雙方已建立TCP連接。

有一點值得說一下,就是當B收到SYN報文段時,會建立一個半開的TCP連接,分配一些資源和變量,並將該連接保存到一個等待建立的隊列中。

當B收到最後的那個ACK報文段時將會把此連接放在一個establish隊列中,顧名思義。

而A的話 當收到SYNACK報文段的時候會爲其分配資源和變量。


另外說一下 win7中,流式套接字的系統分配的默認緩衝區  接收和發送緩衝區都是8K(通過getsockopt函數可以獲取到),通過setsockopt函數可以自行設置。








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章