tcp,transmission control protocol,傳輸控制協定。這是一個面向連接配接的傳輸層協定。
與之相對的無連接配接協定為udp,使用者資料報協定。
傳輸層的基本資料機關為——封包。網絡層——包。資料鍊路層為——幀。實體層——比特。
tcp提供面向連接配接的可靠服務,傳送資料之前必須先建立連接配接,傳送完畢要釋放連結。
伺服器端使用的端口号:熟知端口号——0~1023;登記端口号——1024~49151.
用戶端使用的端口号——49152~65535。這種端口号僅在客戶程序運作時才動态确定。當伺服器程序收到用戶端程序的封包時,就知道了客戶程序使用的端口号。
tcp協定是點對點的,提供不丢失、不重複、無差錯的可靠傳輸。
tcp提供全雙工通信允許通信雙方的程序在任何時候都能發送資料。兩個程序都設有發送緩存和接收緩存。
tcp的可靠傳輸是建立在不可靠的ip層之上的,這很神奇。依靠的措施是——封包确認和逾時重傳。

圖1-1 tcp封包的首部與資料
序号。tcp是面向位元組流的,tcp傳送的每一個位元組都有編号。
确認号(小寫ack)。期望收到對方下一個封包段的資料部分第一個位元組的編号。
資料偏移。指出本tcp封包段的資料部分距離初始部分有多遠。實際上也就是首部的長度。
ack。值為1時确認号才有效。也就是說,建立連接配接後所有的封包段都必須把ack置為1。
psh。若psh為1,封包段直接發送,不再等緩沖區滿了再向下傳遞。
rst。複位辨別。若tcp連結出現嚴重差錯,則重連。
syn。同步辨別,若為1,表明這是連接配接封包或同意連接配接封包。
fin。終止辨別,表示釋放一個連接配接。
接收視窗。告訴發送方自己接收區的緩存大小。
校驗和。檢驗整個封包段。注意區分的是,ip資料報的校驗和隻檢驗ip資料報首部。
最大封包段長度mss。指資料部分的最大長度,加上首部長度才是整個tcp封包段的最大長度。
1.慢開始和擁塞避免。
2.快重傳和快恢複。
圖3-1 三次握手
圖4-1 四次握手
問:為什麼斷開連接配接需要4次握手呢?
答:tcp是全雙工模式,接收到fin時意味将沒有資料再發來,但是還是可以繼續發送資料。
tcp粘包問題。
tcp提供的是可靠的位元組流服務。假設tcp接收方是b,發送方是a。
理想情況下,b每次read的都是a每次write的内容,但事實不是這樣的。
會出現a第一次發送(write)qwer這個位元組流,第二次發送tyui;而b第一次讀到(read)的是qwe,第二次read的是rt,第三次read的是yui這種情況。
為什麼呢?
應用層的資料交給tcp,會被分割再包裝成tcp封包,再加上下面ip層的緩沖區處理、網絡擁塞等狀況,就會發生上面的情況。
應對方法
應用層發送“你好”,假設對應的位元組數組是[1,2,3,4],那麼處理後交給tcp的是 [0,4,1,2,3,4],前兩個byte固定放本次傳輸資料量的大小。tcp接收端再寫一個相應的函數,依據長度提取位元組就可以啦。
我的處理
親測成功(測試中隻有描述尺寸的頭部 分兩次 被read()到的情況沒出現過)