1. 程式人生 > >http 協議三次握手

http 協議三次握手

會話 snmp 位置 RoCE 模型 ram gmp res tar

HTTP是超文本傳輸協議,信息是明文傳輸。TPC/IP協議是傳輸層協議,主要解決數據如何在網絡中傳輸。
HTTP是應用層協議,主要解決如何包裝數據。

【HTTP與TCP/IP】和其他的協議在最初OSI模型中的位置

7 應用層 例如HTTP、SMTP、SNMP、FTP、Telnet、SIP、SSH、NFS、RTSP、XMPP、Whois、ENRP
6 表示層 例如XDR、ASN.1、SMB、AFP、NCP
5 會話層 例如ASAP、TLS、SSH、ISO 8327 / CCITT X.225、RPC、NetBIOS、ASP、Winsock、BSD sockets
4 傳輸層 例如TCP、UDP、RTP、SCTP、SPX、ATP、IL
3 網絡層 例如IP、ICMP、IGMP、IPX、BGP、OSPF、RIP、IGRP、EIGRP、ARP、RARP、 X.25
2 數據鏈路層 例如以太網、令牌環、HDLC、幀中繼、ISDN、ATM、IEEE 802.11、FDDI、PPP
1 物理層 例如線路、無線電、光纖、信鴿

TCP和UDP是高速公路上的“卡車”,它們攜帶的貨物就是像HTTP,文件傳輸協議FTP這樣的協議等。

三次握手建立連接如下:

技術分享圖片

如上圖,客戶端首先發起第一次握手,向服務端示好(我要傳一些數據給你);
服務端聽到後如果表示可以接受數據,則向客戶端發起第二次握手(這次握手表示,我能接受你的數據哦,同時由於TCP/IP是全雙工的,服務端的這次握手也是在詢問,你能接受我返回給你的數據嗎?);


接著客戶端發起第三次握手(告訴服務端,是的,我也能接受你返回給我的數據,OK,這下兩個人都放心了,連接建立成功)。

四次握手關閉連接

技術分享圖片

TCP/IP是全雙工的,每個方向都必須單獨進行關閉。有一方完成它的數據發送任務後就能發送一個FIN來終止這個方向的連接。客戶端得知後在返回一個ACK告訴服務端,好的,收完了,服務端也就可以安心關閉往客戶端的數據傳輸通道了,這是第四次揮手。自此雙向的傳輸通道都已關閉,連接成功釋放。

【註意】中斷連接端可以是Client端,也可以是Server端。

假設Client端發起中斷連接請求,也就是發送FIN報文。Server端接到FIN報文後,意思是說"我Client端沒有數據要發給你了

",但是如果你還有數據沒有發送完成,則不必急著關閉Socket,可以繼續發送數據。所以你先發送ACK,"告訴Client端,你的請求我收到了,但是我還沒準備好,請繼續你等我的消息"。這個時候Client端就進入FIN_WAIT狀態,繼續等待Server端的FIN報文。當Server端確定數據已發送完成,則向Client端發送FIN報文,"告訴Client端,好了,我這邊數據發完了,準備好關閉連接了"。Client端收到FIN報文後,"就知道可以關閉連接了,但是他還是不相信網絡,怕Server端不知道要關閉,所以發送ACK後進入TIME_WAIT狀態,如果Server端沒有收到ACK則可以重傳。“,Server端收到ACK後,"就知道可以斷開連接了"。Client端等待了2MSL後依然沒有收到回復,則證明Server端已正常關閉,那好,我Client端也可以關閉連接了。Ok,TCP連接就這樣關閉了!

整個過程Client端所經歷的狀態如下:

技術分享圖片

技術分享圖片

【註意】 在TIME_WAIT狀態中,如果TCP client端最後一次發送的ACK丟失了,它將重新發送。TIME_WAIT狀態中所需要的時間是依賴於實現方法的。典型的值為30秒、1分鐘和2分鐘。等待之後連接正式關閉,並且所有的資源(包括端口號)都被釋放。

【問題1】為什麽連接的時候是三次握手,關閉的時候卻是四次握手?
答:因為當Server端收到Client端的SYN連接請求報文後,可以直接發送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。但是關閉連接時,當Server端收到FIN報文時,很可能並不會立即關閉SOCKET,所以只能先回復一個ACK報文,告訴Client端,"你發的FIN報文我收到了"。只有等到我Server端所有的報文都發送完了,我才能發送FIN報文,因此不能一起發送。故需要四步握手。

【問題2】為什麽TIME_WAIT狀態需要經過2MSL(最大報文段生存時間)才能返回到CLOSE狀態?

答:雖然按道理,四個報文都發送完畢,我們可以直接進入CLOSE狀態了,但是我們必須假象網絡是不可靠的,有可以最後一個ACK丟失。所以TIME_WAIT狀態就是用來重發可能丟失的ACK報文。

http 協議三次握手