前言
主要記錄TCPIP一些小筆記
說明:
- demo 基於 Linux。
TCP/IP 網路程式設計筆記散集
快速入門:
I/O 緩衝:
- I/O 緩衝在每個 TCP 套接字中單獨存在。
- I/O 緩衝在建立套接字時自動生成。
- 即使關閉套接字也會繼續傳遞輸出緩衝中遺留的資料。
- 關閉套接字將丟失輸入緩衝中的資料。
- 本端呼叫一次 write(),對端可能要分幾次 read() 才能讀完。
資料邊界:
TCP 是流式的資料傳輸,訊息沒有邊界,需要應用層自己去定義訊息邊界。
UDP 是資料包傳輸,所以協議保證了一次只能接收一個資料包。
個人表達:資料邊界意思是,資料會不會自動分割,比如兩個結構體連續存在一段記憶體中,那是有邊界的,結構體把其分割了。若把其資料拷貝到陣列裡面,那是無邊界的,因為分不清從哪裡才是分割線。
UDP 網路程式設計:
- UDP 是可以使用 bind() 函式的,主要是配置本地IP和埠號。若不適用,則由系統隨機分配。
- UDP 是可以使用 connect() 函式的,主要是配置遠端IP和埠號。若不使用,則每次呼叫 sendto() 函式時都要設定、刪除遠端IP和埠號,耗時。
關閉I/O流:
- 呼叫
close()
後:- 輸入緩衝區的資料被丟棄。
- 輸出緩衝區的資料依舊能傳送到目的端。
- 呼叫
shutdown()
後:- 關閉輸入流後,輸入緩衝區的資料被丟棄。後面新來的資料流,會對其進行 ACK,然後丟棄。
- 關閉輸出流後,輸出緩衝區的資料依舊能傳送到目的端。
DNS:
- DNS主要基於UDP。
- 目前全球只有13臺域名根伺服器。
- 並不是每條DNS查詢都要到達根伺服器的,查詢是逐級查詢,各級都有快取表,先查快取表中的,沒有再往上報。
- 8.8.8.8是Google公司提供的免費DNS伺服器的IP地址。
- 也可以指定本地的DNS伺服器,只要能解析域名與IP即可。
TCP:
- MSS,最大報文段長度。在連線建立的時候,即在傳送SYN段的時候,同時會將MSS傳送給對方(MSS選項只能出現在SYN段中!!!),告訴對端他期望接收的TCP報文段資料部分最大長度。
- https://blog.csdn.net/bobozai86/article/details/87372606
套接字選項:
- 套接字型別只能在建立時決定,以後不能再更改。
伺服器快重啟:
- 因為異常斷開後原套接字進入 time-wait 狀態(一般會維持幾分鐘),還沒有進入 close 狀態,所以其埠號等資料還是被佔用的。伺服器重啟後不能正常使用該埠。
- 所以採用
SO_REUSEADDR
設定。作用:- 當有一個有相同本地地址和埠的socket1處於TIME_WAIT狀態時,而你啟動的程式的socket2要佔用該地址和埠,你的程式就要用到該選項。
- SO_REUSEADDR允許同一port上啟動同一伺服器的多個例項(多個程式)。但每個例項繫結的IP地址是不能相同的。在有多塊網路卡或用IP Alias技術的機器可以測試這種情況。
- SO_REUSEADDR允許單個程式繫結相同的埠到多個socket上,但每個socket繫結的ip地址不同。這和2很相似,區別請看UNPv1。
- SO_REUSEADDR允許完全相同的地址和埠的重複繫結。但這隻用於UDP的多播,不用於TCP。
參考
- 《TCP/IP網路程式設計》
- 李柱明部落格-TCP/IP TCP詳細筆記
- github 阿婆主