傳輸層
TCP
TCP連接管理
TCP 是面向連接的協(xié)議。每一個(gè) TCP 連接有三個(gè)階段:連接建立、數(shù)據(jù)傳送、連接釋放。
每一條 TCP 連接有兩個(gè)端點(diǎn)。TCP 連接到端口叫做套接字(socket)或插口。端口拼接到 IP 地址即構(gòu)成了套接字。
每一條 TCP 連接唯一地被通信兩端的兩個(gè)端點(diǎn)(即兩個(gè)套接字)所確定
主動(dòng)發(fā)起連接建立的應(yīng)用進(jìn)程叫做客戶機(jī),而被動(dòng)等待連接建立的應(yīng)用進(jìn)程叫做服務(wù)器
TCP連接的建立
連接經(jīng)歷三個(gè)步驟,通常稱為“三次握手”
?

?
第一步:
客戶機(jī)的 TCP 首先向服務(wù)器的 TCP 發(fā)送一個(gè)連接請(qǐng)求報(bào)文段。這個(gè)特殊的報(bào)文段不含應(yīng)用層數(shù)據(jù),其中首部中的 SYN 標(biāo)志位被置為 1。
另外,客戶機(jī)會(huì)隨機(jī)選擇一個(gè)起始序號(hào) seq=x (連接請(qǐng)求報(bào)文不攜帶數(shù)據(jù),但要消耗一個(gè)序號(hào))
?
第二步:
服務(wù)器的 TCP 收到連接請(qǐng)求報(bào)文段后,如同意建立連接,就向客戶機(jī)發(fā)回確認(rèn),并為該 TCP 連接分配 TCP 緩存和變量。
在確認(rèn)報(bào)文中,SYN 和 ACK 位都被置為1,確認(rèn)號(hào)字段的值為 x+1,并且服務(wù)器隨機(jī)隨機(jī)產(chǎn)生起始序號(hào) seq=y(確認(rèn)報(bào)文不攜帶數(shù)據(jù),但要消耗一個(gè)序號(hào))。確認(rèn)報(bào)文段同樣不包含應(yīng)用層數(shù)據(jù)。
?
第三步:
當(dāng)客戶機(jī)收到確認(rèn)報(bào)文段后,還要向服務(wù)器給出確認(rèn),并且也要給該連接分配緩存和變量。
這個(gè)報(bào)文段的 ACK 標(biāo)志位被置為1,序號(hào)字段為 x+1,確認(rèn)號(hào)字段 ack=y+1。該報(bào)文段可以攜帶數(shù)據(jù),如果不攜帶數(shù)據(jù)則不消耗序號(hào)。
以上三步以后,TCP 連接就建立了,接下來就可以傳送應(yīng)用層數(shù)據(jù)。TCP 提供的是雙全工通信,因此通信雙方的應(yīng)用進(jìn)程在任何時(shí)候都能發(fā)送數(shù)據(jù)。
另外,因?yàn)榉?wù)端的資源是在完成第二次握手時(shí)分配的,而客戶端的資源是在完成第三次握手時(shí)分配的,這就使得服務(wù)器易于受到 SYN 洪泛攻擊。
?
TCP連接的釋放
TCP連接的釋放通常稱為“四次揮手”,參與 TCP 連接的兩個(gè)進(jìn)程中的任何一個(gè)都能終止該連接。
?

?
第一步:
客戶機(jī)打算關(guān)閉連接,就像其 TCP 發(fā)送一個(gè)連接釋放的報(bào)文段,并停止發(fā)送數(shù)據(jù),主動(dòng)關(guān)閉 TCP連接,該報(bào)文段的 FIN 標(biāo)志位被置為1,seq=u,它等于前面已傳送過的數(shù)據(jù)的最后一個(gè)字節(jié)的序號(hào)+1(FIN 報(bào)文段即使不攜帶數(shù)據(jù)也要消耗掉一個(gè)序號(hào))
TCP 是雙全工的,即可以想象成是一條 TCP 連接上有兩條數(shù)據(jù)通路。當(dāng)發(fā)送 FIN 報(bào)文時(shí),發(fā)送 FIN 的一端就不能再發(fā)送數(shù)據(jù),也就關(guān)閉了其中一條數(shù)據(jù)通路,但對(duì)方還可以發(fā)送數(shù)據(jù)。
?
第二步:
服務(wù)器收到連接釋放報(bào)文段后即發(fā)出確認(rèn),確認(rèn)號(hào)是 ack=u+1,而這個(gè)報(bào)文段自己的序號(hào)是 v ,等于它前面已傳送的數(shù)據(jù)的最后一個(gè)字節(jié)的序號(hào)加1。
此時(shí),從客戶機(jī)到服務(wù)器這個(gè)方向的連接就釋放了,TCP 連接處于半關(guān)閉狀態(tài)。但服務(wù)器若發(fā)送數(shù)據(jù),客戶機(jī)仍要接收,即從服務(wù)器到客戶機(jī)這個(gè)方向的連接并未關(guān)閉。
?
第三步:
若服務(wù)器已經(jīng)沒有向客戶機(jī)發(fā)送的數(shù)據(jù),就通知 TCP 釋放連接,此時(shí)其發(fā)出 FIN=1 的連接釋放報(bào)文段。
?
第四步:
客戶機(jī)收到連接釋放報(bào)文段后,必須發(fā)出確認(rèn)。在確認(rèn)報(bào)文段中,ACK 字段被置為1,確認(rèn)號(hào) ack=w+1,序號(hào) seq=u+1。
此時(shí) TCP 連接還沒有釋放掉,必須經(jīng)過時(shí)間等待計(jì)時(shí)器設(shè)置的時(shí)間 2MSL 后,A 才進(jìn)入到連接關(guān)閉狀態(tài)。