三次握手
所謂三次握手(Three-Way Handshake)即建立TCP連接,就是指建立一個TCP連接時,需要客戶端和服務(wù)端總共發(fā)送3個包以確認(rèn)連接的建立。好比兩個人在打電話:
Client: "喂,你能聽得到嗎?"
Server: "我聽得到,你聽得到我嗎?"
Client: "我能聽到你,今天balabala..."
建立連接(三次握手)的過程:

1.客戶端發(fā)送一個帶SYN標(biāo)志的TCP報文到服務(wù)器。這是上圖中三次握手過程中的段1??蛻舳税l(fā)出SYN位表示連接請求。序號是1000,這個序號在網(wǎng)絡(luò)通訊中用作臨時的地址,每發(fā)一個數(shù)據(jù)字節(jié),這個序號要加1,這樣在接收端可以根據(jù)序號排出數(shù)據(jù)包的正確順序,也可以發(fā)現(xiàn)丟包的情況。
另外,規(guī)定SYN位和FIN位也要占一個序號,這次雖然沒發(fā)數(shù)據(jù),但是由于發(fā)了SYN位,因此下次再發(fā)送應(yīng)該用序號1001。
mss表示最大段尺寸,如果一個段太大,封裝成幀后超過了鏈路層的最大長度,就必須在IP層分片,為了避免這種情況,客戶端聲明自己的最大段尺寸,建議服務(wù)器端發(fā)來的段不要超過這個長度。
2.服務(wù)器端回應(yīng)客戶端,是三次握手中的第2個報文段,同時帶ACK標(biāo)志和SYN標(biāo)志。表示對剛才客戶端SYN的回應(yīng);同時又發(fā)送SYN給客戶端,詢問客戶端是否準(zhǔn)備好進(jìn)行數(shù)據(jù)通訊。
服務(wù)器發(fā)出段2,也帶有SYN位,同時置ACK位表示確認(rèn),確認(rèn)序號是1001,表示“我接收到序號1000及其以前所有的段,請你下次發(fā)送序號為1001的段”,也就是應(yīng)答了客戶端的連接請求,同時也給客戶端發(fā)出一個連接請求,同時聲明最大尺寸為1024。
3.客戶必須再次回應(yīng)服務(wù)器端一個ACK報文,這是報文段3。
客戶端發(fā)出段3,對服務(wù)器的連接請求進(jìn)行應(yīng)答,確認(rèn)序號是8001。在這個過程中,客戶端和服務(wù)器分別給對方發(fā)了連接請求,也應(yīng)答了對方的連接請求,其中服務(wù)器的請求和應(yīng)答在一個段中發(fā)出。
因此一共有三個段用于建立連接,稱為“三方握手”。在建立連接的同時,雙方協(xié)商了一些信息,例如,雙方發(fā)送序號的初始值、最大段尺寸等。
數(shù)據(jù)傳輸?shù)倪^程:
1.客戶端發(fā)出段4,包含從序號1001開始的20個字節(jié)數(shù)據(jù)。
2.服務(wù)器發(fā)出段5,確認(rèn)序號為1021,對序號為1001-1020的數(shù)據(jù)表示確認(rèn)收到,同時請求發(fā)送序號1021開始的數(shù)據(jù),服務(wù)器在應(yīng)答的同時也向客戶端發(fā)送從序號8001開始的10個字節(jié)數(shù)據(jù)。
3.客戶端發(fā)出段6,對服務(wù)器發(fā)來的序號為8001-8010的數(shù)據(jù)表示確認(rèn)收到,請求發(fā)送序號8011開始的數(shù)據(jù)。
在數(shù)據(jù)傳輸過程中,ACK和確認(rèn)序號是非常重要的,應(yīng)用程序交給TCP協(xié)議發(fā)送的數(shù)據(jù)會暫存在TCP層的發(fā)送緩沖區(qū)中,發(fā)出數(shù)據(jù)包給對方之后,只有收到對方應(yīng)答的ACK段才知道該數(shù)據(jù)包確實(shí)發(fā)到了對方,可以從發(fā)送緩沖區(qū)中釋放掉了,如果因為網(wǎng)絡(luò)故障丟失了數(shù)據(jù)包或者丟失了對方發(fā)回的ACK段,經(jīng)過等待超時后TCP協(xié)議自動將發(fā)送緩沖區(qū)中的數(shù)據(jù)包重發(fā)。
四次揮手
所謂四次揮手(Four-Way-Wavehand)即終止TCP連接,就是指斷開一個TCP連接時,需要客戶端和服務(wù)端總共發(fā)送4個包以確認(rèn)連接的斷開。在socket編程中,這一過程由客戶端或服務(wù)器任一方執(zhí)行close來觸發(fā)。好比兩個人打完電話要掛斷:
Client: "我要說的事情都說完了,我沒事了。掛啦?"
Server: "等下,我還有一個事兒。Balabala…"
Server: "好了,我沒事兒了。掛了啊。"
Client: "ok!拜拜"
關(guān)閉連接(四次握手)的過程:
由于TCP連接是全雙工的,因此每個方向都必須單獨(dú)進(jìn)行關(guān)閉。這原則是當(dāng)一方完成它的數(shù)據(jù)發(fā)送任務(wù)后就能發(fā)送一個FIN來終止這個方向的連接。收到一個 FIN只意味著這一方向上沒有數(shù)據(jù)流動,一個TCP連接在收到一個FIN后仍能發(fā)送數(shù)據(jù)。首先進(jìn)行關(guān)閉的一方將執(zhí)行主動關(guān)閉,而另一方執(zhí)行被動關(guān)閉。
1. 客戶端發(fā)出段7,F(xiàn)IN位表示關(guān)閉連接的請求。
2. 服務(wù)器發(fā)出段8,應(yīng)答客戶端的關(guān)閉連接請求。
3. 服務(wù)器發(fā)出段9,其中也包含F(xiàn)IN位,向客戶端發(fā)送關(guān)閉連接請求。
4. 客戶端發(fā)出段10,應(yīng)答服務(wù)器的關(guān)閉連接請求。
建立連接的過程是三次握手,而關(guān)閉連接通常需要4個段,服務(wù)器的應(yīng)答和關(guān)閉連接請求通常不合并在一個段中,因為有連接半關(guān)閉的情況,這種情況下客戶端關(guān)閉連接之后就不能再發(fā)送數(shù)據(jù)給服務(wù)器了,但是服務(wù)器還可以發(fā)送數(shù)據(jù)給客戶端,直到服務(wù)器也關(guān)閉連接為止。


所有資料源于網(wǎng)絡(luò),如需刪除請聯(lián)系博主。