scrapy ip地址 tcp time out_TCP的运作流程(一)——“三次握手”
前言
?看過前面有關(guān)兩篇HTTP的文章的同學,想必對HTTP已經(jīng)有了一定的了解。在HTTP初始(一)中提到過TCP/IP四層網(wǎng)絡模型,這次我們就來詳細了解一下TCP傳輸。因為時間和篇幅所限,本篇講分為兩章,本章講TCP的三次握手,下章講TCP的四次揮手,以及一些常見問題。
TCP的狀態(tài)轉(zhuǎn)化
先知全貌再看細節(jié)是很不錯的學習方法,以后我的寫作風格也盡量向這方面靠攏。所以在具體講解TCP的三次握手和四次揮手前,我們先來整體看下TCP是如何運作的。??????
???????????????????????????????? ?(該圖片來源自網(wǎng)絡)我們先來具體了解下各個狀態(tài)的具體含義和關(guān)系,前5步是TCP三次握手,后六步是TCP四次揮手:
CLOSED:起始點,在超時或者連接關(guān)閉時進入此狀態(tài);Client和Server的初始態(tài)都應是CLOSED。
LISTEN:Server端在等待連接時的狀態(tài),Server端為此要調(diào)用Socket、bind、listen函數(shù),就能進入此狀態(tài)。這稱為應用程序被動打開(等待客戶端來連接)。
SYN-SENT:客戶端發(fā)起連接,發(fā)送SYN給服務器端。如果服務器端不能連接則進入CLOSED狀態(tài)。
SYN-RCVD:與3對應,服務器端接受客戶端的SYN請求,服務器端由LISTEN狀態(tài)進入SYN-RCVD狀態(tài)。同時服務器端要回應一個ACK,發(fā)送一個SYN給客戶端;另一種情況是,客戶端在發(fā)起SYN的同時接收到服務器端的SYN請求,客戶端會由SYN-SEBT轉(zhuǎn)換到SYN-RCVD狀態(tài)。
ESTABLISHED:服務器端和客戶端在完成3次握手后進入狀態(tài),說明已經(jīng)可以開始傳輸數(shù)據(jù)了。
FIN-WAIT-1:主動關(guān)閉的一方,由狀態(tài)5進入此狀態(tài)。具體動作是發(fā)送FIN給對方。
FIN-WAIT-2:主動關(guān)閉的一方,接收到對方的FIN ACK,進入此狀態(tài)。由此不能再接收對方的數(shù)據(jù),但是能夠向?qū)Ψ桨l(fā)送數(shù)據(jù)。
CLOSE-WAIT:接收到FIN以后,被動關(guān)閉的一方進入此狀態(tài)。具體動作是再接收到FIN的同時發(fā)送ACK。
LAST-ACK:被動關(guān)閉的一方,發(fā)起關(guān)閉請求,由狀態(tài)8進入此狀態(tài)。具體動作是發(fā)送FIN給對方,同時再接收到AKC時進入CLOSED狀態(tài)。
CLOSING:兩邊同時發(fā)起關(guān)閉請求時,會由FIN-WAIT-1進入此狀態(tài)。具體動作是接收到FIN請求,同時響應一個ACK。
TIME-WAIT:這個狀態(tài)比較復雜,也是我們最常見的一個連接狀態(tài),有3個狀態(tài)可以轉(zhuǎn)化為此狀態(tài)。
- 由FIN-WAIT-2轉(zhuǎn)換到TIME-WAIT,具體情況是:在雙方不同時發(fā)起FIN的情況下,主動關(guān)閉的一方在完成自身發(fā)起的關(guān)閉請求后,接收到被動關(guān)閉一方的FIN后進入的狀態(tài)。
- 由CLOSING轉(zhuǎn)換到TIME-WAIT,具體情況是:在雙方同時發(fā)起關(guān)閉,都做了發(fā)起FIN的請求,同時接收到了FIN并做了ACK的情況下,這時就由CLOSING狀態(tài)進入TIME-WAIT狀態(tài)。
- 由FIN-WAIT-1轉(zhuǎn)換到TIME-WAIT,具體情況是:同時接收到FIN(對方發(fā)起)和ACK(本身發(fā)起的FIN回應),它與CLOSING轉(zhuǎn)換到TIME-WAIT的區(qū)別在于本身發(fā)起的FIN回應的ACK先于對方的FIN請求到達,而由CLOSING轉(zhuǎn)換到TIME-WAIT則是FIN先到達。
TCP報文
“TCP報文是TCP傳輸?shù)臄?shù)據(jù)單元,也叫做報文段、數(shù)據(jù)包。
”TCP三次握手
“其實三次握手就是用來建立TCP連接的,TCP數(shù)據(jù)在傳輸之前需要進行3次通信,一般被稱為“三次握手”。這種建立連接的方式可以防止產(chǎn)生錯誤的連接,TCP使用的流量控制協(xié)議時可變大小的滑動窗口協(xié)議。
”- 第一次握手:客戶端發(fā)送SYN(seq=x)報文到服務器端,并進入SYN_SENT狀態(tài)。
- 第二次握手:服務器端收到來自客戶端的SYN報文,向客戶端回應一個SYN(seq=y)和ACK(ack=x+1)報文,并進入SYN_RCVD狀態(tài)。
- 第三次握手:客戶端收到來自服務器端的SYN+ACK報文,向服務器端回應一個確認報文ACK(ack=y+1),發(fā)送完畢后,客戶端和服務器端都進入ESTABLISHED狀態(tài)。
在三次握手完成后,TCP客戶端和服務器端成功建立連接,就可以傳輸數(shù)據(jù)了。
如此教科書般的回答,我也不是很滿意,下面我們來從西瓜籽和大西瓜的對話中的了解下,什么是TCP三次握手:第一次:
西瓜籽:我是西瓜籽,大西瓜你真帥!
說明:西瓜籽會夸人。第二次:
大西瓜:我收到了你的夸贊,我是大西瓜,其實西瓜籽你也挺不錯的!
說明:大西瓜可以接受別人的夸贊,也會夸人。第三次:
西瓜籽:我也收到了你的夸贊,我現(xiàn)在越看你越帥!
說明:西瓜籽也能接受別人的夸贊。
這倆人簡直志同道合,然后就開始了雙方的互夸Time.......(數(shù)據(jù)傳輸)
總結(jié),我認為TCP三次握手有兩個目的:一:是為了確保連接的兩端都做好了發(fā)送和接收數(shù)據(jù)的準備工作二:每方都具有雙方傳輸數(shù)據(jù)的序列號
總結(jié)
以上是生活随笔為你收集整理的scrapy ip地址 tcp time out_TCP的运作流程(一)——“三次握手”的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python将excel日期比大小_sq
- 下一篇: 多线程面试题系列(12):多线程同步内功