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