1.TCP在七層網絡模型中的位置

TCP工作在網絡OSI的七層模型中的第四層——Transport層,IP在第三層——Network層,ARP在第二層——Data Link層;在第二層上的數據,我們把它叫Frame,在第三層上的數據叫Packet,第四層的數據叫Segment。 同時,我們需要簡單的知道,數據從應用層發(fā)下來,會在每一層都會加上頭部信息,進行封裝,然后再發(fā)送到數據接收端。這個基本的流程你需要知道,就是每個數據都會經過數據的封裝和解封裝的過程。
2. 五層模型與七層模型

3.TCP的概念
TCP(Transmission Control Protocol 傳輸控制協(xié)議)是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議。
3.1TCP與UDP的區(qū)別
- 基于連接與無連接
- TCP要求系統(tǒng)資源較多,UDP較少;
- UDP程序結構較簡單
- 流模式(TCP)與數據報模式(UDP);
- TCP保證數據正確性,UDP可能丟包
- TCP保證數據順序,UDP不保證
4.三次握手與四次揮手
用到的TCP報頭信息:
- ACK : TCP協(xié)議規(guī)定,只有ACK=1時有效,也規(guī)定連接建立后所有發(fā)送的報文的ACK必須為1
- SYN(SYNchronization) : 在連接建立時用來同步序號。當SYN=1而ACK=0時,表明這是一個連接請求報文。對方若同意建立連接,則應在響應報文中使SYN=1和ACK=1. 因此, SYN置1就表示這是一個連接請求或連接接受報文。
-
FIN (finis)即完,終結的意思, 用來釋放一個連接。當 FIN = 1 時,表明此報文段的發(fā)送方的數據已經發(fā)送完畢,并要求釋放連接。
TCP三次握手示意圖
4.1 三次握手:
- 第一次握手:建立連接??蛻舳税l(fā)送連接請求報文段,將SYN位置為1,Sequence Number為x;然后,客戶端進入SYN_SEND狀態(tài),等待服務器的確認;
- 第二次握手:服務器收到SYN報文段。服務器收到客戶端的SYN報文段,需要對這個SYN報文段進行確認,設置Acknowledgment Number為x+1(Sequence Number+1);同時,自己自己還要發(fā)送SYN請求信息,將SYN位置為1,Sequence Number為y;服務器端將上述所有信息放到一個報文段(即SYN+ACK報文段)中,一并發(fā)送給客戶端,此時服務器進入SYN_RECV狀態(tài);
- 第三次握手:客戶端收到服務器的SYN+ACK報文段。然后將Acknowledgment Number設置為y+1,向服務器發(fā)送ACK報文段,這個報文段發(fā)送完畢以后,客戶端和服務器端都進入ESTABLISHED狀態(tài),完成TCP三次握手。
完成了三次握手,客戶端和服務器端就可以開始傳送數據。以上就是TCP三次握手的總體介紹。
4.2四次分手過程
- 第一次分手:主機1(可以使客戶端,也可以是服務器端),設置Sequence Number和Acknowledgment Number,向主機2發(fā)送一個FIN報文段;此時,主機1進入FIN_WAIT_1狀態(tài);這表示主機1沒有數據要發(fā)送給主機2了;
- 第二次分手:主機2收到了主機1發(fā)送的FIN報文段,向主機1回一個ACK報文段,Acknowledgment Number為Sequence Number加1;主機1進入FIN_WAIT_2狀態(tài);主機2告訴主機1,我“同意”你的關閉請求;
- 第三次分手:主機2向主機1發(fā)送FIN報文段,請求關閉連接,同時主機2進入LAST_ACK狀態(tài);
- 第四次分手:主機1收到主機2發(fā)送的FIN報文段,向主機2發(fā)送ACK報文段,然后主機1進入TIME_WAIT狀態(tài);主機2收到主機1的ACK報文段以后,就關閉連接;此時,主機1等待2MSL后依然沒有收到回復,則證明Server端已正常關閉,那好,主機1也可以關閉連接了。
4.3為什么三次握手?
三次握手是在不可靠網絡中實現(xiàn)可靠網絡通信的最少握手次數,可以有效防止“已失效的連接請求報文段突然又傳送到了服務端,因而產生錯誤”,例如:client發(fā)出的第一個連接請求報文段并沒有丟失,而是在某個網絡結點長時間的滯留了,以致延誤到連接釋放以后的某個時間才到達server。本來這是一個早已失效的報文段。但server收到此失效的連接請求報文段后,就誤認為是client再次發(fā)出的一個新的連接請求。于是就向client發(fā)出確認報文段,同意建立連接。假設不采用“三次握手”,那么只要server發(fā)出確認,新的連接就建立了。由于現(xiàn)在client并沒有發(fā)出建立連接的請求,因此不會理睬server的確認,也不會向server發(fā)送數據。但server卻以為新的運輸連接已經建立,并一直等待client發(fā)來數據。這樣,server的很多資源就白白浪費掉了。
4.4為什么四次揮手
關閉連接時,當Server端收到FIN報文時,很可能并不會立即關閉SOCKET,所以只能先回復一個ACK報文,告訴Client端,"你發(fā)的FIN報文我收到了"。只有等到我Server端所有的報文都發(fā)送完了,我才能發(fā)送FIN報文,因此不能一起發(fā)送。故需要四步握手。
4.5 TIME_WAIT為什么是2MSL
為什么TIME_WAIT狀態(tài)需要經過2MSL(最大報文段生存時間)才能返回到CLOSE狀態(tài)?
雖然按道理,四個報文都發(fā)送完畢,我們可以直接進入CLOSE狀態(tài)了,但是我們必須假象網絡是不可靠的,有可以最后一個ACK丟失。所以TIME_WAIT狀態(tài)就是用來重發(fā)可能丟失的ACK報文。
