TCP/IP(Transmission Control Protocol/Internet Protocol,傳輸控制協議/網際協議)是指能夠在多個不同網絡間實現信息傳輸的協議簇。TCP/IP協議不僅僅指的是TCP?和IP兩個協議,而是指一個由FTP、SMTP、TCP、UDP、IP等協議構成的協議簇, 只是因為在TCP/IP協議中TCP協議和IP協議最具代表性,所以被稱為TCP/IP協議。
TCP/IP傳輸協議,即傳輸控制/網絡協議,也叫作網絡通訊協議。它是在網絡的使用中的最基本的通信協議。TCP/IP傳輸協議對互聯網中各部分進行通信的標準和方法進行了規定。并且,TCP/IP傳輸協議是保證網絡數據信息及時、完整傳輸的兩個重要的協議。TCP/IP傳輸協議是嚴格來說是一個四層的體系結構,應用層、傳輸層、網絡層和數據鏈路層都包含其中。
TCP/IP協議在一定程度上參考了OSI的體系結構。OSI模型共有七層,從下到上分別是物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層和應用層。但是這顯然是有些復雜的,所以在TCP/IP協議中,它們被簡化為了四個層次。
(1)應用層、表示層、會話層三個層次提供的服務相差不是很大,所以在TCP/IP協議中,它們被合并為應用層一個層次。?應用層是TCP/IP協議的第一層,是直接為應用進程提供服務的。
(2)傳輸層:作為TCP/IP協議的第二層,傳輸層在整個TCP/IP協議中起到了中流砥柱的作用。且在傳輸層中,TCP和UDP也同樣起到了中流砥柱的作用。
(3)網絡層:在TCP/IP協議中的位于第三層。在TCP/IP協議中網絡層可以進行網絡連接的建立和終止以及IP地址的尋找等功能。
(4)因為數據鏈路層和物理層的內容相差不多,所以在TCP/IP協議中它們被歸并在網絡接口層一個層次里。由于網絡接口層兼并了物理層和數據鏈路層所以,網絡接口層既是傳輸數據的物理媒介,也可以為網絡層提供一條準確無誤的線路。
1 通信過程及相關協議
在網絡通信的過程中,將發出數據的主機稱為源主機,接收數據的主機稱為目的主機。當源主機發出數據時,數據在源主機中從上層向下層傳送。源主機中的應用進程先將數據交給應用層,應用層加上必要的控制信息就成了報文流,向下傳給傳輸層。傳輸層將收到的數據單元加上本層的控制信息,形成報文段、數據報,再交給網際層。網際層加上本層的控制信息,形成IP數據報,傳給網絡接口層。網絡接口層將網際層交下來的IP數據報組裝成幀,并以比特流的形式傳給網絡硬件(即物理層),數據就離開源主機。
在TCP/IP連接中,為了確保雙方都能準備好發送和接收數據,會進行一系列的控制信號交換,這其中包括了“三次握手”來建立連接和“四次揮手”來關閉連接。三次握手和四次揮手是TCP協議中建立連接和釋放連接的重要過程,它們確保了數據傳輸的可靠性和連接的正確管理。
TCP/IP協議中,主動發起請求的一端稱為『客戶端』,被動連接的一端稱為『服務端』。不管是客戶端還是服務端,TCP連接建立完后都能發送和接收數據。
剛開始的時候,服務器和客戶端都為CLOSED狀態。在通信開始前,雙方都得創建各自的傳輸控制塊(TCB)。
服務器創建完TCB后遍進入LISTEN狀態,此時準備接收客戶端發來的連接請求。
2 三次握手(Three-way Handshake)
三次握手用于建立TCP連接,確保發送方和接收方都準備好進行數據傳輸。以下是三次握手的步驟:
第一次握手
客戶端向服務端發送連接請求報文段。該報文段的頭部中同步SYN=1,確認ACK=0,同時選擇一個初始序號seq=x。請求發送后,客戶端便進入SYN-SENT狀態,等待服務器確認。
SYN=1,ACK=0表示該報文段為連接請求報文
x為本次TCP通信的字節流的初始序號
SYN=1的報文段不能有數據部分,但要消耗掉一個序號
第二次握手
服務器收到連接請求的SYN報文之后,必須確認客戶的SYN(SYN=1,ACK=1,ack=x+1,seq=y),同時自己也發送一個SYN包(SYN=1,seq=y),即SYN+ACK包,此時服務器進入SYN_RECV狀態。
SYN=1,ACK=1表示該報文段為連接同意的應答報文
seq=y表示服務端作為發送者時,發送字節流中的第一個字節序號
ack=x+1表示服務端希望客戶端發送的下一個數據報初始序號是從x+1開始
第三次握手
客戶端收到服務器連接統一的應答SYN+ACK包,向服務器發送確認包(ACK=1,ack=y+1,seq=x+1,acknum=y+1),此包發送完畢,表示服務端發來的連接同意應答已經成功收到。客戶端和服務器進入ESTABLISHED(代表成功打開一個TCP/IP連接,數據可以傳送給用戶)狀態,完成三次握手。
完成三次握手,客戶端與服務器開始傳送數據。
3 四次揮手(Four-way Handshake)
TCP連接的釋放一共需要四步,這也是四次揮手的由來。
TCP連接是雙向的,在四次揮手中,前兩次揮手用于斷開一個方向的連接,后兩次揮手用于斷開另一方向的連接。確保發送方和接收方都關閉了數據傳輸的通道。以下是四次揮手的步驟:
第一次揮手
客戶端數據發送完成,則它向服務端發送連接釋放請求。該請求只有報文頭,頭中攜帶的主要參數為:FIN=1,seq=u,用來關閉客戶端到服務器的數據傳送。此時,客戶端將進入FIN-WAIT-1狀態。FIN報文段即使不攜帶數據,也要消耗一個序號。
FIN=1表示該報文段是一個連接釋放請求
seq=u,u-1是客戶端向服務端發送的最后一個字節的序號
第二次揮手
服務器收到客戶端連接釋放報文FIN后,發送一個ACK給客戶端,報文頭為:ACK=1,ack=u+1(確認序號為收到序號+1),并且帶上自己的序列號seq=v。服務器進入CLOSE_WAIT狀態。此時TCP連接處于半關閉狀態,即客戶端已經沒有要發送的數據了,但服務器若發送數據,客戶端仍要接受。這個狀態還要持續一段時間,也就是整個CLOSE_WAIT狀態持續的時間。
ACK=1:除TCP連接請求報文段以外,TCP通信過程中所有數據報的ACK都為1,表示應答
seq=v,v是服務端釋放應答報文段第一個字節序號
ack=u+1表示希望收到從第u+1個字節開始的報文段,并且已經成功接收了前u個字節
客戶端收到該應答后,進入FIN-WAIT-2狀態,等待服務器發送連接釋放報文(在這之前還需要接受服務器發送的最后的數據)。
第二次揮手完成后,客戶端到服務端方向的連接已經釋放,服務端不會再接收客戶端的數據,客戶端也沒有數據要發送了。但服務端到客戶端方向的連接仍然存在,服務器若發送數據,客戶端依然要接受。這個狀態還要持續一段時間,也就是整個CLOSE-WAIT狀態持續的時間。
第三次揮手
服務端將最后的數據發送完畢后,就向客戶端發送連接釋放報文FIN,用來關閉服務器到客戶端的數據傳送,其報文頭包含:FIN=1,ack=u+1,由于在CLOS-WAIT狀態,服務端很可能又發送了一些數據,假定此時的序列號為seq=w,此時,服務器進入LAST_ACK狀態,等待客戶端的確認。
第四次揮手
客戶端收到服務器的連接釋放報文FIN后,向服務端發出確認應答,報文頭為:ACK=1,ack=w+1,而自己的序列號是seq=u+1,客戶端進入TIME_WAIT狀態,接著發送一個ACK給服務器,確認后,服務器進入CLOSED狀態,客戶端等待一段時間后也進入了CLOSED狀態。
注意,客戶端最后還要等待一段時間,這就是TIME_WAIT狀態。客戶端等待一段時間是為了確保服務器收到了ACK,如果此時服務器沒有收到ACK則可以重傳。這個等待時間通常是2MSL(最長報文段壽命)的時間。當客戶端撤銷相應的TCB后,就進入了CLOSED狀態。服務器只要收到了客戶端發來的ACK報文,就撤銷TCB,進入CLOSED狀態。
4 總結
三次握手:通過三次報文段的交換,客戶端和服務器建立了可靠的連接,并相互確認了初始序列號。
四次揮手:在數據傳輸結束后,通過四次報文段的交換,客戶端和服務器正確地釋放了連接,并確保了雙方都已收到對方的確認信息。
序列號:在TCP通信中,序列號用于標識每個報文段,確保數據的順序性和完整性。
ACK和SYN標志位:ACK標志位用于確認收到的報文段,SYN標志位用于建立連接時的同步。
TIME_WAIT狀態:客戶端在關閉連接后會進入TIME_WAIT狀態,等待一段時間以確保服務器收到了ACK報文段,從而避免“已失效的連接請求”問題。