目錄
前言
主要記錄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 阿婆主