• <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>

            從頭再來

            重學TCP協議(一)

            目的:重新梳理TCP,全局理解協議中的細節,知道是怎樣實現的,理解為什么要這樣做,了解可能會帶來什么問題。

            PS:圖片有空了慢慢貼。

             

             

             

            簡要介紹:

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

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

            1) 恰當的數據分段。即將字節流根據MSS來封包發送。

            2) 確認機制、重傳機制。

            3) 首部的檢驗和。

            4) 網絡層的IP數據報可能會失序,因此TCP需要將數據進行重新排序。

            5) 數據報可能會重復,必須恰當的丟棄重復的數據報。

            6) TCP提供流量控制,可根據另一端的緩沖區情況發送恰當的數據(滑動窗口協議)。

            7) TCP協議對字節流不作解釋。由應用層對數據進行語義上的解釋。

             

            隨便抓個包:

             

            IP數據頭

             

            TCP數據頭

             

            頭部中比較重要的數據結構

            源端口,目的端口,序號,確認序號。 標志位,窗口大小。

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

            ACK:經常用,接收端發給源端,確認前一個包已收到。

            PSH:個人沒怎么碰到過。

            RST:可以理解為重置連接,普通情況下當目標端口未開放會發送此RST回來,此外,連接中間的防火墻等網絡設備也會發。

             

            SYN:發起連接的標志,SYN Flood是基于的一種DOS攻擊手法。

            FINshutdown 時發送,告訴對方,我這邊完成了,要送掉連接了。

             

             

             

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

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

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

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

             

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

             

            關于ISN的選擇,根據文獻內容,應當隨時間變化,避免網絡中被延遲的分組被重新傳遞后導致的錯誤解釋。

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

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

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

            3) B關閉連接,發送FIN

            4) A發送ACK

             

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

             

            以下是一個簡單的client + server 測試代碼,通過簡單的Sleep可以看出, 當收到FIN包時,緩沖區的數據仍然存在,僅在后面多了一個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 閱讀(180) 評論(0)  編輯 收藏 引用

            亚洲欧洲中文日韩久久AV乱码| 亚洲精品乱码久久久久久久久久久久 | 久久精品国产久精国产果冻传媒 | 久久精品国产亚洲AV不卡| 久久久久久无码国产精品中文字幕| 久久久这里只有精品加勒比| 欧美一区二区三区久久综| 国产免费久久精品丫丫| 伊人久久综合无码成人网| 国产成人精品久久亚洲| 久久久www免费人成精品| 精品久久久无码中文字幕| 亚洲国产精品18久久久久久| 国内精品久久久久久久涩爱| 伊人 久久 精品| 久久av免费天堂小草播放| 精品一区二区久久久久久久网站| 日本WV一本一道久久香蕉| 国产成人精品久久综合| 久久精品国产亚洲综合色| 久久精品无码午夜福利理论片| 区久久AAA片69亚洲| 欧美无乱码久久久免费午夜一区二区三区中文字幕 | 午夜天堂精品久久久久| 欧美激情精品久久久久久久九九九| 婷婷综合久久中文字幕| 久久99国产综合精品女同| 一本一道久久综合狠狠老| 久久午夜无码鲁丝片秋霞| 久久亚洲AV成人无码软件| 中文字幕精品久久久久人妻| 四虎久久影院| 久久精品国产亚洲AV久| 97精品依人久久久大香线蕉97| 香蕉久久夜色精品国产尤物| 一级a性色生活片久久无少妇一级婬片免费放 | 狠狠色丁香久久综合婷婷| 久久精品免费观看| 久久成人永久免费播放| 日韩电影久久久被窝网| 久久天天躁狠狠躁夜夜av浪潮 |