<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    逝者如斯夫

    靜而思之
    數據加載中……

    TCP連接的過程

    編寫:Leaf Zhou
    EMAIL:leaf_zhou_8@hotmail.com

    TCP是英文Transport Control Protocol的縮寫。從字面理解,就是傳輸控制協議。因此,TCP是一種控制協議,他本身不能用來傳輸數據,它需要通過網絡層的IP協議來進行實際數據的傳輸。這也就是我們常常看到,TCP/IP和TCP/UDP總是同時出現的原因。因此,也可以理解為TCP是很多的不同的協議組成,實際上是一個協議組。提供可靠的主機到主機層數據傳輸控制協議。這里要先強調一下,傳輸控制協議是OSI網絡的第四層的叫法,TCP傳輸控制協議是TCP/IP傳輸的6個基本協議的一種。TCP是一種可靠的面向連接的傳送服務。它在

    一、TCP概述
    TCP是英文Transport Control Protocol的縮寫。從字面理解,就是傳輸控制協議。因此,TCP是一種控制協議,他本身不能用來傳輸數據,它需要通過網絡層的IP協議來進行實際數據的傳輸。這也就是我們常常看到,TCP/IP和TCP/UDP總是同時出現的原因。因此,也可以理解為TCP是很多的不同的協議組成,實際上是一個協議組。提供可靠的主機到主機層數據傳輸控制協議。這里要先強調一下,傳輸控制協議是OSI網絡的第四層的叫法,TCP傳輸控制協議是TCP/IP傳輸的6個基本協議的一種。TCP是一種可靠的面向連接的傳送服務。它在傳送數據時是分段進行的,主機交換數據必須先建立一個會話。它用比特流通信,即數據被作為無結構的字節流進行傳輸,沒有數據邊界。通過每個TCP傳輸的字段指定順序號,以獲得可靠性。是在OSI參考模型中的第四層,TCP是使用IP的網間互聯功能而提供可靠的數據傳輸,IP不停的把報文放到網絡上,而TCP是負責確信報文到達。在協同IP的操作中TCP負責:握手過程、報文管理、流量控制、錯誤檢測和處理(控制),可以根據一定的編號順序對非正常順序的報文給予從新排列順序。關于TCP的RFC文檔有RFC793、RFC791、RFC1700。

    二、TCP連接的建立
    建立一個TCP連接,需要下面的步驟:
    (1)服務器端通過listen來準備接受外來的連接,稱為被動打開(passive open)。
    (2) 客戶端通過connect進行連接服務器,稱為主動打開(active open)。在這個操作中,客戶端需要發送一個同步數據報(SYN),用來通知服務器端開始發送數據的初始序列號。通常情況下,同步數據報不攜帶數據,它只包含一個IP頭部、一個TCP頭部和本次通信所使用的TCP的選項。
    (3)服務器端必須對客戶端發來的同步數據報SYN進行確認,同時自己也要發送一個同步數據報(SYN),它包含客戶端發送數據的初始序列號。服務器端對在同一連接中發送的數據初始序號和對客戶端發送的確認信息(ACK),都放在一個數據報中,一起發送給客戶端。
    (4)客戶端也必須發送確認服務器端的同步數據報(SYN)。
    由上面的步驟來看,建立一個TCP連接,至少需要服務器端和客戶端進行三個分組數據的交換,因此,稱之為TCP的三路握手(three-way handshake)。

    ????????????客戶端???????????????????????????服務器端
    ????????????connect()????????????????????????accept()
    ????????????????????? --->?SYN?S?----->???
    ??????????????????????<---?SYN?C
    , ACK?S+ 1 ?<---??????
    ??????????????????????--->?ACK?C+
    1 ?----->

    第一次進行分組數據交換的過程中,分組數據中可能包含著本次通信中可能的TCP選項。這些選項有:
    (1) 最大分組(MSS)選項。TCP發送的SYN中帶有這個選項,用來告訴對方它的最大分組數據的大小MSS(Maximum Segment Size),即它能接收的每個TCP分組數據中的最大數據量。這個選項可以通過TCP_MAXSEG套接口選項獲取與設置這個TCP選項。
    (2) 窗口大小選項。這是TCP能提供流量控制的主要手段。TCP連接的每一方都有固定大小的緩沖空間,TCP的接收端只允許另一端發送接收端緩沖區所能接納的數據。這將防止較快主機致使較慢主機的緩沖區溢出。TCP雙方能夠通知對方的最大窗口大小是64K(65535 bytes),因為TCP頭部相應的標識字段值只用了16位來表示。每個套接口都有一個發送緩沖區和一個接收緩沖區,接收緩沖區被TCP和UDP用來將接收到的數據一直保存到由應用進程來讀取。對于TCP,TCP通告另一端的窗口大小。 TCP套接口接收緩沖區不可能溢出,因為對方不允許發出超過所通告窗口大小的數據。這就是TCP的流量控制,如果對方無視窗口大小而發出了超過窗口大小的數據,則接收方TCP將丟棄它;而對于UDP,當套接口接收緩沖區放不下接收到的數據報時,此數據報就被丟棄。UDP是沒有流量控制的,快的發送者可以很容易地就淹沒慢的接收者,導致接收方的UDP丟棄數據報,使數據發生丟失。
    (3)時間戳選項。時間戳選項使發送方在每個報文段中放置一個時間戳值。接收方在確認中返回這個數值,從而允許發送方為每一個收到的ACK計算RTT。

    三、TCP連接的終止
    終止TCP連接
    TCP用三個分組數據建立一個連接,但要終止一個連接則通常需要需要四個分組數據。過程如下:
    (1)先調用close的進程,稱為主動關閉(active close)。這一端的TCP先發送一個FIN分組數據,告訴對方,數據發送完畢。
    (2)接收到FIN分組數據的一端執行被動關閉(passive close),同時,發送對這個FIN的確認ACK分組數據給對方。確認序號為收到的序號加1。FIN分組數據的接收意味著在當前的連接上,再也不會收到額外的數據。
    (3)接收到FIN分組數據的一端的應用進程,將調用close關閉自己的套接口,同時TCP 會發送一個FIN分組數據給另一端。
    (4)收到這個FIN的分組數據,即執行主動關閉的一端對這個FIN分組數據進行確認。發回確認ACK分組數據,并將確認序號設置為收到序號加1

    在這個過程中,執行被動關閉的一方可以把確認對方FIN分組數據的ACK分組數據和自己要發送的FIN分組數據可以放到一個分組數據中。TCP的連接終止的過程如下:

    ????????????客戶端???????????????????????????服務器端
    ????????????close()??????????????????????????close()
    ??????????????????????--->?FIN?S?----->???
    ??????????????????????<---?ACK?S+
    1 ?<---??????
    ??????????????????????<---?FIN?C???<---
    ??????????????????????--->?FIN?C+
    1 ?--->

    四、TCP連的狀態?????????????????
    TCP的連接的建立和終止,基本上已經清楚了,那么在這個過程中,是如何知道這個連接正處在什么狀態呢?方法當然是有的,我們先運行如下命令,看看返回的結果:

    [root@linux81?leaf]#?netstat?-an
    Active?Internet?connections?(servers?and?established)
    Proto?Recv-Q?Send-Q?Local?Address???????????Foreign?Address?????????State????
    tcp????????
    0??????0?0.0.0.0:3306????????????0.0.0.0:*???????????????LISTEN????
    tcp????????
    0??????0?0.0.0.0:139?????????????0.0.0.0:*???????????????LISTEN????
    tcp????????
    0??????0?0.0.0.0:21??????????????0.0.0.0:*???????????????LISTEN????
    tcp????????
    0??????0?0.0.0.0:22??????????????0.0.0.0:*???????????????LISTEN????
    tcp????????
    0??????0?0.0.0.0:23??????????????0.0.0.0:*???????????????LISTEN????
    tcp????????
    0??????0?192.168.253.81:139??????192.168.253.35:1201?????ESTABLISHED
    tcp????????
    0????272?192.168.253.81:22???????192.168.253.59:1776?????ESTABLISHED
    udp????????
    0??????0?192.168.253.81:137??????0.0.0.0:*?????????????????????????
    udp????????
    0??????0?0.0.0.0:137?????????????0.0.0.0:*?????????????????????????
    udp????????
    0??????0?192.168.253.81:138??????0.0.0.0:*?????????????????????????
    udp????????
    0??????0?0.0.0.0:138?????????????0.0.0.0:*?????????????????????????
    udp????????
    0??????0?127.0.0.1:36260?????????0.0.0.0:*??????????

    在上面的返回結果中,State一列,就是說明連接的當前狀態。
    TCP的連接狀態有:
    (01)CLOSED??
    (02)LISTEN??? 被動打開
    (03)SYN_RCVD??
    (04)SYN_SEND
    (05)ESTABLISHED?? 數據傳送狀態
    (06)CLOSE_WAIT
    (07)LAST_ACK?? 被動關閉
    (08)FIN_WAIT_1
    (09)FIN_WAIT_2
    (10)CLOSING
    (11)TIME_WAIT

    TCP連接狀態轉換示意圖如下所示:

    ??????????????????????????????+---------+?---------\??????active?OPEN
    ??????????????????????????????|??CLOSED?|????????????\????-----------
    ??????????????????????????????+---------+<---------\???\???create?TCB
    ????????????????????????????????|?????^??????????????\???\??snd?SYN??
    ???????????????????passive?OPEN?|?????|???CLOSE????????\???\?????????
    ???????????????????------------?|?????|?----------???????\???\???????
    ????????????????????create?TCB??|?????|?delete?TCB?????????\???\?????
    ????????????????????????????????V?????|??????????????????????\???\???
    ??????????????????????????????+---------+????????????CLOSE????|????\?
    ??????????????????????????????|??LISTEN?|??????????----------?|?????|
    ??????????????????????????????+---------+??????????delete?TCB?|?????|
    ???????????????????rcv?SYN??????|?????|?????SEND??????????????|?????|
    ??????????????????-----------???|?????|????-------????????????|?????V
    +---------+??????snd?SYN
    ,ACK??/???????\???snd?SYN??????????+---------+
    |?????????|<-----------------???????????------------------>|?????????|
    |???SYN???|????????????????????rcv?SYN?????????????????????|???SYN???|
    |???RCVD??|<-----------------------------------------------|???SENT??|
    |?????????|????????????????????snd?ACK?????????????????????|?????????|
    |?????????|------------------???????????-------------------|?????????|
    +---------+???rcv?ACK?of?SYN??\???????/??rcv?SYN
    ,ACK???????+---------+
    ???|???????????--------------???|?????|???-----------????????????????
    ???|??????????????????x?????????|?????|?????snd?ACK??????????????????
    ???|????????????????????????????V?????V??????????????????????????????
    ???|??CLOSE???????????????????+---------+????????????????????????????
    ???|?-------??????????????????|??ESTAB??|????????????????????????????
    ???|?snd?FIN??????????????????+---------+????????????????????????????
    ???|???????????????????CLOSE????|?????|????rcv?FIN???????????????????
    ???V??????????????????-------???|?????|????-------???????????????????
    +---------+??????????snd?FIN??/???????\???snd?ACK??????????+---------+
    |??FIN????|<-----------------???????????------------------>|??CLOSE??|
    |?WAIT-
    1??|------------------??????????????????????????????|???WAIT??|
    +---------+??????????rcv?FIN??\????????????????????????????+---------+
    ???|?rcv?ACK?of?FIN???-------???|????????????????????????????CLOSE??|
    ???|?--------------???snd?ACK???|???????????????????????????-------?|
    ???V????????x???????????????????V???????????????????????????snd?FIN?V
    +---------+??????????????????+---------+???????????????????+---------+
    |FINWAIT-
    2|??????????????????|?CLOSING?|???????????????????|?LAST-ACK|
    +---------+??????????????????+---------+???????????????????+---------+
    ???|????????????????rcv?ACK?of?FIN?|?????????????????rcv?ACK?of?FIN?|
    ???|??rcv?FIN???????--------------?|????Timeout
    =2MSL?--------------?|
    ???|??-------??????????????x???????V????------------????????x???????V
    ????\?snd?ACK?????????????????+---------+delete?TCB?????????+---------+
    ?????------------------------>|TIME?WAIT|------------------>|?CLOSED??|
    ??????????????????????????????+---------+???????????????????+---------+

    ????????????????????? TCP Connection State Diagram

    從上面的圖表中,可以做出如下總結:
    服務器端的正常狀態轉換過程如下:
    ? CLOSED --> LISTEN --> SYN_RCVD --> ESTABLISHED --> CLOSE_WAIT --> LAST_ACK --> CLOSED
    客戶端的正常狀態轉換過程如下:
    CLOSED --> SYN_SENT --> ESTABLISHED --> FIN_WAIT_1 --> FIN_WAIT_2 --> TIME_WAIT --> CLOSED
    從上面的連接狀態轉換中可以看出,從ESTABLISHED狀態的轉換有兩種,對于客戶端和服務器端來說,是一樣的,即當收到FIN數據報之前,主動關閉,則轉換成FIN_WAIT_1;如果因為收到FIN數據報,而引起的被動關閉,則轉換成CLOSE_WAIT狀態。

    posted on 2009-02-09 18:11 ideame 閱讀(2459) 評論(1)  編輯  收藏 所屬分類: Linux

    評論

    # re: TCP連接的過程  回復  更多評論   

    請問:我的send函數在默認得阻塞模式下工作,每次我要發送大概4萬多字節得一個圖片信息,可是每次只發送不到一萬字節就發送失敗,返回-1,錯誤號10054,找了好久也找不到答案,忘高手指點
    2009-08-31 17:05 | kinail
    主站蜘蛛池模板: 日本亚洲精品色婷婷在线影院| 精品国产人成亚洲区| 911精品国产亚洲日本美国韩国| 一出一进一爽一粗一大视频免费的 | 亚洲AV成人精品网站在线播放| av午夜福利一片免费看久久| 九月婷婷亚洲综合在线 | eeuss影院免费直达入口| 亚洲Av无码乱码在线播放| 国产亚洲女在线线精品| 免费在线观看你懂的| 一本久久免费视频| 红杏亚洲影院一区二区三区| 三级毛片在线免费观看| 久久亚洲一区二区| 亚洲一级毛片免费看| 国产亚洲精品bv在线观看| 女人18毛片水最多免费观看| 看亚洲a级一级毛片| 久久精品国产精品亚洲人人| 最近中文字幕免费大全| 久久久无码精品亚洲日韩蜜臀浪潮| 91精品视频在线免费观看| avtt天堂网手机版亚洲| 国产精品免费视频播放器| 国产免费久久精品99久久| 久久亚洲精品中文字幕| 四虎永久在线观看免费网站网址| 亚洲香蕉久久一区二区| 国产一区在线观看免费| 日韩精品无码免费专区网站 | 亚洲男人电影天堂| 女人被男人桶得好爽免费视频| 麻豆一区二区三区蜜桃免费| 亚洲国产日韩在线视频| av无码久久久久不卡免费网站| 亚洲av乱码一区二区三区按摩 | 成人免费视频一区二区| 国产成人亚洲综合色影视| 国产情侣激情在线视频免费看| 校园亚洲春色另类小说合集|