【網路編程】TCPIP-小筆記集合


前言

主要記錄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報文段數據部分最大長度。
  • //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。

參考