1、基礎(chǔ)
1.1 概述-網(wǎng)絡(luò)編程原型
網(wǎng)絡(luò)編程的基本模式就是Client-Server模型,兩個進(jìn)程進(jìn)行通信,由服務(wù)端提供位置信息,包括綁定的ip地址和監(jiān)聽端口,客戶端通過鏈接操作向服務(wù)端監(jiān)聽的地址發(fā)起連接請求,通過三次握手建立連接,如果連接成功,雙方就可以通過網(wǎng)絡(luò)套接字(sockt)進(jìn)行通信
1.2 TCP報(bào)文格式
TCP/IP協(xié)議的詳細(xì)信息參看《TCP/IP協(xié)議詳解》三卷本。下面是TCP報(bào)文格式圖:

??? ? 上圖中有幾個字段需要重點(diǎn)介紹下:
????? ? (1)序號:Seq序號,占32位,用來標(biāo)識從TCP源端向目的端發(fā)送的字節(jié)流,發(fā)起方發(fā)送數(shù)據(jù)時對此進(jìn)行標(biāo)記。
? ??? ? (2)確認(rèn)序號:Ack序號,占32位,只有ACK標(biāo)志位為1時,確認(rèn)序號字段才有效,Ack=Seq+1。
????? ? (3)標(biāo)志位:共6個,即URG、ACK、PSH、RST、SYN、FIN等,具體含義如下:
????? ? ????? ? (A)URG:緊急指針(urgent pointer)有效。
????????????? ? (B)ACK:確認(rèn)序號有效。
????????????? ? (C)PSH:接收方應(yīng)該盡快將這個報(bào)文交給應(yīng)用層。
????????????? ? (D)RST:重置連接。
????????????? ? (E)SYN:發(fā)起一個新連接。
????????????? ? (F)FIN:釋放一個連接。
2-三次連接原理
2.1 原理

第一次握手:主機(jī)A發(fā)送位碼為syn=1,隨機(jī)產(chǎn)生seq number=1234567的數(shù)據(jù)包到服務(wù)器,主機(jī)B由SYN=1知道,A要求建立聯(lián)機(jī);
?第二次握手:主機(jī)B收到請求后要確認(rèn)聯(lián)機(jī)信息,向A發(fā)送ack number=(主機(jī)A的seq+1),syn=1,ack=1,隨機(jī)產(chǎn)生seq=7654321的包;
?第三次握手:主機(jī)A收到后檢查ack number是否正確,即第一次發(fā)送的seq number+1,以及位碼ack是否為1,若正確,主機(jī)A會再發(fā)送ack number=(主機(jī)B的seq+1),ack=1,主機(jī)B收到后確認(rèn)seq值與ack=1則連接建立成功。
?完成三次握手,主機(jī)A與主機(jī)B開始傳送數(shù)據(jù)。
2.2 為什么是三次?
本質(zhì):信道不可靠, 但是通信雙發(fā)需要就某個問題達(dá)成一致. 而要解決這個問題, 無論你在消息中包含什么信息, 三次通信是理論上的最小值.
舉例:client發(fā)送的syn消息出現(xiàn)延遲,而已經(jīng)有新的syn到達(dá)
4-四次揮手原理
4.1 原理

1、當(dāng)主機(jī)A確認(rèn)發(fā)送完數(shù)據(jù)且知道B已經(jīng)接受完了,想要關(guān)閉發(fā)送數(shù)據(jù)口(當(dāng)然確認(rèn)信號還是可以發(fā)),就會發(fā)FIN給主機(jī)B。
2、主機(jī)B收到A發(fā)送的FIN,表示收到了,就會發(fā)送ACK回復(fù)。
3、但這是B可能還在發(fā)送數(shù)據(jù),沒有想要關(guān)閉數(shù)據(jù)口的意思,所以FIN與ACK不是同時發(fā)送的,而是等到B數(shù)據(jù)發(fā)送完了,才會發(fā)送FIN給主機(jī)A。
4、A收到B發(fā)來的FIN,知道B的數(shù)據(jù)也發(fā)送完了,回復(fù)ACK, A等待2MSL以后,沒有收到B傳來的任何消息,知道B已經(jīng)收到自己的ACK了,A就關(guān)閉鏈接,B也關(guān)閉鏈接了。
A為什么等待2MSL,從TIME_WAIT到CLOSE?
?在Client發(fā)送出最后的ACK回復(fù),但該ACK可能丟失。Server如果沒有收到ACK,將不斷重復(fù)發(fā)送FIN片段。所以Client不能立即關(guān)閉,它必須確認(rèn)Server接收到了該ACK。Client會在發(fā)送出ACK之后進(jìn)入到TIME_WAIT狀態(tài)。Client會設(shè)置一個計(jì)時器,等待2MSL的時間。如果在該時間內(nèi)再次收到FIN,那么Client會重發(fā)ACK并再次等待2MSL。所謂的2MSL是兩倍的MSL(Maximum
Segment
Lifetime)。MSL指一個片段在網(wǎng)絡(luò)中最大的存活時間,2MSL就是一個發(fā)送和一個回復(fù)所需的最大時間。如果直到2MSL,Client都沒有再次收到FIN,那么Client推斷ACK已經(jīng)被成功接收,則結(jié)束TCP連接。
4.2為什么是四次?
這是因?yàn)榉?wù)端在LISTEN狀態(tài)下,收到建立連接請求的SYN報(bào)文后,把ACK和SYN放在一個報(bào)文里發(fā)送給客戶端。而關(guān)閉連接時,當(dāng)收到對方的FIN報(bào)文時,僅僅表示對方不再發(fā)送數(shù)據(jù)了但是還能接收數(shù)據(jù),己方也未必全部數(shù)據(jù)都發(fā)送給對方了,所以己方可以立即close,也可以發(fā)送一些數(shù)據(jù)給對方后,再發(fā)送FIN報(bào)文給對方來表示同意現(xiàn)在關(guān)閉連接,因此,己方ACK和FIN一般都會分開發(fā)送。
5、一個段子收尾
三次握手:
A:“喂,你聽得到嗎?”A->SYN_SEND
B:“我聽得到呀,你聽得到我嗎?”應(yīng)答與請求同時發(fā)出 B->SYN_RCVD | A->ESTABLISHED
A:“我能聽到你,今天balabala……”B->ESTABLISHED
四次揮手:
A:“喂,我不說了?!盇->FIN_WAIT1
B:“我知道了。等下,上一句還沒說完。Balabala…..”B->CLOSE_WAIT | A->FIN_WAIT2
B:”好了,說完了,我也不說了?!盉->LAST_ACK
A:”我知道了?!盇->TIME_WAIT | B->CLOSED
A等待2MSL,保證B收到了消息,否則重說一次”我知道了”,A->CLOSED