【網路程式設計】TCPIP-小筆記集合

李柱明發表於2021-08-26


前言

主要記錄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 設定。作用:
    1. 當有一個有相同本地地址和埠的socket1處於TIME_WAIT狀態時,而你啟動的程式的socket2要佔用該地址和埠,你的程式就要用到該選項。
    2. SO_REUSEADDR允許同一port上啟動同一伺服器的多個例項(多個程式)。但每個例項繫結的IP地址是不能相同的。在有多塊網路卡或用IP Alias技術的機器可以測試這種情況。
    3. SO_REUSEADDR允許單個程式繫結相同的埠到多個socket上,但每個socket繫結的ip地址不同。這和2很相似,區別請看UNPv1。
    4. SO_REUSEADDR允許完全相同的地址和埠的重複繫結。但這隻用於UDP的多播,不用於TCP。

參考

相關文章