UNIX網絡編程第三版(卷1)讀書筆記以及習題-章節2

1. 幾個關鍵點

  • 常用連接協議TCP、UDP的特點:

    • TCP:可靠的,全雙工(同一時刻,允許數據在兩個方向上同時傳輸)通信協議。

      • 完成一次連接需要進行3次握手:客戶端發起請求(SYN) —— 服務器收到客戶端請求(SYN)並返回確認(ACK) —— 客戶端收到服務器確認(ACK)併發送確認的確認(ACK) —— 服務器收到客戶端確認(ACK),建立連接。
      • 完成一次斷開需要進行4次握手:主動關閉方發送(FIN) —— 接收方發送回覆(ACK) && 接收方發送(FIN) —— 主動關閉放發送回覆(ACK) —— 接收方收到回覆(ACK),關閉連接。
      • 一個完整的請求流程:
        • 當服務器bind一個套接字的時候,一般服務器是一個多宿(簡單理解爲多個IP地址,一般bind一個端口,一個外網IP一個內網IP,例如xxx.xxx.xxx.xxx:21和192.168.1.100:21)的綁定。會生成一個套接字對,對應4節數據(本機地址:本機端口,對端地址:對端端口),初始綁定時,內容相當於( * :21;* : * ),*是通配符。
        • 客戶端連接成功之後,客戶端也會生成一個套接字對,例如(192.168.1.110:1500;192.168.1.100:21)這裏的本地端口,客戶端會開啓一個空閒端口。
        • 服務器不管是否會開啓新線程去處理連接,當客戶端連接後,之前的套接字對會綁定客戶端的IP和端口,例如(192.168.1.100:21;192.168.1.110:1500),如果開啓了新線程,線程會綁定上述的套接字對,主進程依然是初始化的狀態繼續監聽。
      • 一個完成的數據包裝流程:
        • 程序調用write方法,會將原本程序緩衝區的數據嘗試寫入到套接字發送緩衝區(SO_SNDBUF),如果出現發送緩衝區不足,這時程序就會阻塞知道將需要寫的數據全部寫完。注意:全部寫完之後write就會返回成功,這時候並不能代表服務器已經收到數據。
        • 接着進入傳輸層,本機傳輸層會將數據按照MSS大小(最小536字節)分塊,拼上TCP頭和尾。
        • 接着傳入網絡層,網絡層可能會進一步給數據分節,並拼上IP頭和尾。
        • 接着傳入鏈路層,插入帶發送隊列中,這時如果隊列已滿,會拋棄該節數據,並向上返回錯誤。上層會進行重試,並不會將錯誤返回給應用層。
        • 接着進行網絡傳輸,中間會不斷的收到服務器的ACK確認,只有當最終傳輸完畢後,收到了服務器的確認,本地纔會拋棄套接字緩衝區的緩存。
    • UDP:不可靠的通信協議。

      • 和TCP的最大區別是數據包裝的時候,因爲本身是不可靠的,因此並沒有套接字緩衝區緩存UDP數據,經過傳輸層、網絡層分片、增加對應頭尾後,直接發送,如果發送隊列已滿,會直接拋棄該數據包,內核會返回給應用程序一個ENOBUFS錯誤,但是有些實現不返回該錯誤,這時,本機也許就直接拋棄了。
  • netstat查看進程常見狀態解釋:

    • ESTABLISHED:TCP連接被建立的時候,正常狀態。
    • TIME_WAIT:根據之前關閉的四次握手,當接收方發送了FIN等待最後一個確認到達之前就會轉變爲該狀態。
    • CLOSED:連接被關閉。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章