久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

TCP/IP詳解學(xué)習(xí)筆記(10)

 zcxuexi 2015-03-04

TCP是一個(gè)面向連接的協(xié)議,,所以在連接雙方發(fā)送數(shù)據(jù)之前,,都需要首先建立一條連接。這和前面講到的協(xié)議完全不同,。前面講的所有協(xié)議都只是發(fā)送數(shù)據(jù)而已,,大多數(shù)都不關(guān)心發(fā)送的數(shù)據(jù)是不是送到,UDP尤其明顯,,從編程的角度來說,,UDP編程也要簡單的多----UDP都不用考慮數(shù)據(jù)分片。

書中用telnet登陸退出來解釋TCP協(xié)議連接的建立和中止的過程,,可以看到,,TCP連接的建立可以簡單的稱為三次握手,,而連接的中止則可以叫做四次握手,。

1.連接的建立

在建立連接的時(shí)候,客戶端首先向服務(wù)器申請打開某一個(gè)端口(用SYN段等于1的TCP報(bào)文),,然后服務(wù)器端發(fā)回一個(gè)ACK報(bào)文通知客戶端請求報(bào)文收到,,客戶端收到確認(rèn)報(bào)文以后再次發(fā)出確認(rèn)報(bào)文確認(rèn)剛才服務(wù)器端發(fā)出的確認(rèn)報(bào)文(繞口么),至此,,連接的建立完成,。這就叫做三次握手。如果打算讓雙方都做好準(zhǔn)備的話,,一定要發(fā)送三次報(bào)文,,而且只需要三次報(bào)文就可以了。

可以想見,,如果再加上TCP的超時(shí)重傳機(jī)制,,那么TCP就完全可以保證一個(gè)數(shù)據(jù)包被送到目的地。

2.結(jié)束連接

TCP有一個(gè)特別的概念叫做half-close,這個(gè)概念是說,,TCP的連接是全雙工(可以同時(shí)發(fā)送和接收)連接,,因此在關(guān)閉連接的時(shí)候,必須關(guān)閉傳和送兩個(gè)方向上的連接,??蛻魴C(jī)給服務(wù)器一個(gè)FIN為1的TCP報(bào)文,然后服務(wù)器返回給客戶端一個(gè)確認(rèn)ACK報(bào)文,,并且發(fā)送一個(gè)FIN報(bào)文,,當(dāng)客戶機(jī)回復(fù)ACK報(bào)文后(四次握手),連接就結(jié)束了,。

3.最大報(bào)文長度

在建立連接的時(shí)候,,通信的雙方要互相確認(rèn)對方的最大報(bào)文長度(MSS),以便通信,。一般這個(gè)SYN長度是MTU減去固定IP首部和TCP首部長度,。對于一個(gè)以太網(wǎng),一般可以達(dá)到1460字節(jié),。當(dāng)然如果對于非本地的IP,,這個(gè)MSS可能就只有536字節(jié),而且,,如果中間的傳輸網(wǎng)絡(luò)的MSS更佳的小的話,,這個(gè)值還會(huì)變得更小。

4.TCP的狀態(tài)遷移圖

書P182頁給出了TCP的狀態(tài)圖,,這是一個(gè)看起來比較復(fù)雜的狀態(tài)遷移圖,,因?yàn)樗藘蓚€(gè)部分---服務(wù)器的狀態(tài)遷移和客戶端的狀態(tài)遷移,如果從某一個(gè)角度出發(fā)來看這個(gè)圖,,就會(huì)清晰許多,,這里面的服務(wù)器和客戶端都不是絕對的,發(fā)送數(shù)據(jù)的就是客戶端,,接受數(shù)據(jù)的就是服務(wù)器,。

4.1.客戶端應(yīng)用程序的狀態(tài)遷移圖

客戶端的狀態(tài)可以用如下的流程來表示:

CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED

以上流程是在程序正常的情況下應(yīng)該有的流程,從書中的圖中可以看到,,在建立連接時(shí),,當(dāng)客戶端收到SYN報(bào)文的ACK以后,客戶端就打開了數(shù)據(jù)交互地連接,。而結(jié)束連接則通常是客戶端主動(dòng)結(jié)束的,,客戶端結(jié)束應(yīng)用程序以后,需要經(jīng)歷FIN_WAIT_1,,F(xiàn)IN_WAIT_2等狀態(tài),,這些狀態(tài)的遷移就是前面提到的結(jié)束連接的四次握手。

4.2.服務(wù)器的狀態(tài)遷移圖

服務(wù)器的狀態(tài)可以用如下的流程來表示:

CLOSED->LISTEN->SYN收到->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED

在建立連接的時(shí)候,服務(wù)器端是在第三次握手之后才進(jìn)入數(shù)據(jù)交互狀態(tài),,而關(guān)閉連接則是在關(guān)閉連接的第二次握手以后(注意不是第四次),。而關(guān)閉以后還要等待客戶端給出最后的ACK包才能進(jìn)入初始的狀態(tài)。

4.3.其他狀態(tài)遷移

書中的圖還有一些其他的狀態(tài)遷移,,這些狀態(tài)遷移針對服務(wù)器和客戶端兩方面的總結(jié)如下

  1. LISTEN->SYN_SENT,,對于這個(gè)解釋就很簡單了,服務(wù)器有時(shí)候也要打開連接的嘛,。
  2. SYN_SENT->SYN收到,,服務(wù)器和客戶端在SYN_SENT狀態(tài)下如果收到SYN數(shù)據(jù)報(bào),則都需要發(fā)送SYN的ACK數(shù)據(jù)報(bào)并把自己的狀態(tài)調(diào)整到SYN收到狀態(tài),,準(zhǔn)備進(jìn)入ESTABLISHED
  3. SYN_SENT->CLOSED,,在發(fā)送超時(shí)的情況下,會(huì)返回到CLOSED狀態(tài),。
  4. SYN_收到->LISTEN,,如果受到RST包,會(huì)返回到LISTEN狀態(tài),。
  5. SYN_收到->FIN_WAIT_1,,這個(gè)遷移是說,可以不用到ESTABLISHED狀態(tài),,而可以直接跳轉(zhuǎn)到FIN_WAIT_1狀態(tài)并等待關(guān)閉,。

4.4.2MSL等待狀態(tài)

書中給的圖里面,有一個(gè)TIME_WAIT等待狀態(tài),,這個(gè)狀態(tài)又叫做2MSL狀態(tài),,說的是在TIME_WAIT2發(fā)送了最后一個(gè)ACK數(shù)據(jù)報(bào)以后,要進(jìn)入TIME_WAIT狀態(tài),,這個(gè)狀態(tài)是防止最后一次握手的數(shù)據(jù)報(bào)沒有傳送到對方那里而準(zhǔn)備的(注意這不是四次握手,,這是第四次握手的保險(xiǎn)狀態(tài))。這個(gè)狀態(tài)在很大程度上保證了雙方都可以正常結(jié)束,,但是,,問題也來了,。

由于插口的2MSL狀態(tài)(插口是IP和端口對的意思,,socket),使得應(yīng)用程序在2MSL時(shí)間內(nèi)是無法再次使用同一個(gè)插口的,,對于客戶程序還好一些,,但是對于服務(wù)程序,例如httpd,,它總是要使用同一個(gè)端口來進(jìn)行服務(wù),,而在2MSL時(shí)間內(nèi),啟動(dòng)httpd就會(huì)出現(xiàn)錯(cuò)誤(插口被使用)。為了避免這個(gè)錯(cuò)誤,,服務(wù)器給出了一個(gè)平靜時(shí)間的概念,,這是說在2MSL時(shí)間內(nèi),雖然可以重新啟動(dòng)服務(wù)器,,但是這個(gè)服務(wù)器還是要平靜的等待2MSL時(shí)間的過去才能進(jìn)行下一次連接,。

4.5.FIN_WAIT_2狀態(tài)

這就是著名的半關(guān)閉的狀態(tài)了,這是在關(guān)閉連接時(shí),,客戶端和服務(wù)器兩次握手之后的狀態(tài),。在這個(gè)狀態(tài)下,應(yīng)用程序還有接受數(shù)據(jù)的能力,,但是已經(jīng)無法發(fā)送數(shù)據(jù),,但是也有一種可能是,客戶端一直處于FIN_WAIT_2狀態(tài),,而服務(wù)器則一直處于WAIT_CLOSE狀態(tài),,而直到應(yīng)用層來決定關(guān)閉這個(gè)狀態(tài)。

5.RST,,同時(shí)打開和同時(shí)關(guān)閉

RST是另一種關(guān)閉連接的方式,,應(yīng)用程序應(yīng)該可以判斷RST包的真實(shí)性,即是否為異常中止,。而同時(shí)打開和同時(shí)關(guān)閉則是兩種特殊的TCP狀態(tài),,發(fā)生的概率很小。

6.TCP服務(wù)器設(shè)計(jì)

前面曾經(jīng)講述過UDP的服務(wù)器設(shè)計(jì),,可以發(fā)現(xiàn)UDP的服務(wù)器完全不需要所謂的并發(fā)機(jī)制,,它只要建立一個(gè)數(shù)據(jù)輸入隊(duì)列就可以。但是TCP不同,,TCP服務(wù)器對于每一個(gè)連接都需要建立一個(gè)獨(dú)立的進(jìn)程(或者是輕量級的,,線程),來保證對話的獨(dú)立性,。所以TCP服務(wù)器是并發(fā)的,。而且TCP還需要配備一個(gè)呼入連接請求隊(duì)列(UDP服務(wù)器也同樣不需要),來為每一個(gè)連接請求建立對話進(jìn)程,,這也就是為什么各種TCP服務(wù)器都有一個(gè)最大連接數(shù)的原因,。而根據(jù)源主機(jī)的IP和端口號碼,服務(wù)器可以很輕松的區(qū)別出不同的會(huì)話,,來進(jìn)行數(shù)據(jù)的分發(fā),。

掌握本章的狀態(tài)遷移圖才是學(xué)習(xí)本章的關(guān)鍵。

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多