• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            從頭再來

            重學(xué)TCP協(xié)議(一)

            目的:重新梳理TCP,全局理解協(xié)議中的細(xì)節(jié),知道是怎樣實(shí)現(xiàn)的,理解為什么要這樣做,了解可能會帶來什么問題。

            PS:圖片有空了慢慢貼。

             

             

             

            簡要介紹:

            TCP協(xié)議是基于網(wǎng)絡(luò)層IP協(xié)議的傳輸層協(xié)議,提供一種面向連接的,可靠的字節(jié)流服務(wù)(byte stream service )。在TCP連接中, 僅支持兩方進(jìn)行彼此通信。

            TCP的可靠性由以下方式 來提供:

            1) 恰當(dāng)?shù)臄?shù)據(jù)分段。即將字節(jié)流根據(jù)MSS來封包發(fā)送。

            2) 確認(rèn)機(jī)制、重傳機(jī)制。

            3) 首部的檢驗(yàn)和。

            4) 網(wǎng)絡(luò)層的IP數(shù)據(jù)報(bào)可能會失序,因此TCP需要將數(shù)據(jù)進(jìn)行重新排序。

            5) 數(shù)據(jù)報(bào)可能會重復(fù),必須恰當(dāng)?shù)膩G棄重復(fù)的數(shù)據(jù)報(bào)。

            6) TCP提供流量控制,可根據(jù)另一端的緩沖區(qū)情況發(fā)送恰當(dāng)?shù)臄?shù)據(jù)(滑動(dòng)窗口協(xié)議)。

            7) TCP協(xié)議對字節(jié)流不作解釋。由應(yīng)用層對數(shù)據(jù)進(jìn)行語義上的解釋。

             

            隨便抓個(gè)包:

             

            IP數(shù)據(jù)頭

             

            TCP數(shù)據(jù)頭

             

            頭部中比較重要的數(shù)據(jù)結(jié)構(gòu)

            源端口,目的端口,序號,確認(rèn)序號。 標(biāo)志位,窗口大小。

            URG:緊急指針,一般用不上,忽略。

            ACK:經(jīng)常用,接收端發(fā)給源端,確認(rèn)前一個(gè)包已收到。

            PSH:個(gè)人沒怎么碰到過。

            RST:可以理解為重置連接,普通情況下當(dāng)目標(biāo)端口未開放會發(fā)送此RST回來,此外,連接中間的防火墻等網(wǎng)絡(luò)設(shè)備也會發(fā)。

             

            SYN:發(fā)起連接的標(biāo)志,SYN Flood是基于的一種DOS攻擊手法。

            FINshutdown 時(shí)發(fā)送,告訴對方,我這邊完成了,要送掉連接了。

             

             

             

            1、 TCP連接的建議,三步握手。

            1) 源端發(fā)送SYN到服務(wù)器,表示喜娃懷與服務(wù)器的某個(gè)端口建立TCP連接,在TCP首部帶上初始的序號(client ISN)。此報(bào)文中設(shè)置SYN=1

            2) 服務(wù)器返回SYN包,帶上服務(wù)器的初始序號(server ISN),并且ACK=client ISN+1設(shè)置SYN=1,ACK=1

            3) 源端返回服務(wù)器ACK包,  ack = server ISN+1;

             

            PS:這邊的Seq居然從0開始,之前都沒注意過~~

             

            關(guān)于ISN的選擇,根據(jù)文獻(xiàn)內(nèi)容,應(yīng)當(dāng)隨時(shí)間變化,避免網(wǎng)絡(luò)中被延遲的分組被重新傳遞后導(dǎo)致的錯(cuò)誤解釋。

            2、 TCP連接的終止,四步握手。

            1) 首先關(guān)閉的一方(A)發(fā)送FIN包。FIN在應(yīng)用層、開發(fā)者面前就是socket.read 將返回EOF

            2) 接受端(B)返回FINACK包。

            3) B關(guān)閉連接,發(fā)送FIN

            4) A發(fā)送ACK

             

            關(guān)閉階段存在另外兩衍生的流程。1 23 兩步可以合并, 當(dāng)B端無數(shù)據(jù)發(fā)送時(shí),無需發(fā)放兩個(gè)包,可以在一個(gè)包里面同時(shí)設(shè)置FIN+ACK,也就是上面的截圖。2)當(dāng)僅一端調(diào)用shutdown,另一端還存在數(shù)據(jù)發(fā)送時(shí),存在半關(guān)閉連接的情況。即第2步結(jié)束后,B端繼續(xù)發(fā)送數(shù)據(jù),A端對這些數(shù)據(jù)仍然發(fā)送ACK,一直到B端發(fā)送FIN

             

            以下是一個(gè)簡單的client + server 測試代碼,通過簡單的Sleep可以看出, 當(dāng)收到FIN包時(shí),緩沖區(qū)的數(shù)據(jù)仍然存在,僅在后面多了一個(gè)EOF而已。

             

             1 #!/usr/bin/env python
             2 import socket
             3 import time
             4  
             5 host="192.168.5.106"
             6 port=10000
             7 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
             8 s.bind((host,port))
             9 s.listen(5)
            10 sock,addr=s.accept()
            11 print "got connection form ",sock.getpeername()
            12 while 1:
            13   data=sock.recv(1)
            14   time.sleep(0.1)
            15   if not data:
            16     print("~~~~~")
            17     break
            18   else:
            19 print data
            20  


             

            1 #!/usr/bin/env python
            2 import socket
            3 host="192.168.5.106"
            4 port=10000
            5 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
            6 s.connect((host,port))
            7 s.send("hello from client")
            8 s.close()

             

             

            posted on 2015-05-16 21:58 易寶@byhh 閱讀(168) 評論(0)  編輯 收藏 引用


            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            东方aⅴ免费观看久久av| 精品多毛少妇人妻AV免费久久 | 国产精品久久久久aaaa| 99久久精品国产一区二区| 久久天天躁狠狠躁夜夜不卡| 国产成人精品久久亚洲| 国产成人精品久久一区二区三区av | 久久久久久久久久久精品尤物| 久久国产精品一区| 精品久久久无码中文字幕天天| 国产精品青草久久久久婷婷| 久久av无码专区亚洲av桃花岛| 亚洲中文字幕无码一久久区| 久久人人爽人人爽人人片AV不| 久久人人爽人人人人片av| 亚洲AV无码久久精品色欲| 热re99久久精品国99热| 久久精品国产亚洲av水果派 | 久久夜色tv网站| 国产99久久久国产精免费| 国内精品久久久久久麻豆 | 久久精品国产久精国产思思| 久久国产精品-久久精品| 国产亚州精品女人久久久久久 | 久久综合久久伊人| 热久久最新网站获取| 亚洲午夜久久久久久噜噜噜| 蜜臀av性久久久久蜜臀aⅴ麻豆| 亚洲av伊人久久综合密臀性色| 久久国产精品久久国产精品| 欧美麻豆久久久久久中文| 亚洲精品国产美女久久久| 日本精品久久久久中文字幕| 欧美日韩中文字幕久久久不卡| 久久久国产亚洲精品| 无码人妻久久一区二区三区 | 91久久精品国产免费直播| 四虎国产精品成人免费久久| 精品无码久久久久久午夜| 亚洲国产精品久久久久婷婷软件 | avtt天堂网久久精品|