1. 程式人生 > >msl、ttl及rtt的區別 TCP控制欄位標誌

msl、ttl及rtt的區別 TCP控制欄位標誌

       四次握手不是關閉 TCP連線的唯一方法. 有時,如果主機需要儘快關閉連線(或連線超時,埠或主機不可達),RST (Reset)包將被髮送. 注意在,由於RST包不是TCP連線中的必須部分, 可以只發送RST包(即不帶ACK標記). 但在正常的TCP連線中RST包可以帶ACK確認標記
      1. syn傳送到伺服器主機,但是目的埠並未執行。則產生一個ECONRFUSED錯誤。客戶端立即返回。比如telnet 192.168.1.55 8889,條件:55主機在區域網上並且可達(也可以換成可以到達的網路ip地址),但是8889這個埠並未使用(可能伺服器已經關閉),則伺服器(對 方主機tcp核心)傳送一個rst相應給客戶端,於是客戶端立即關閉。 注意一下,如果輸入的網路ip不可達的話,客戶端將會持續傳送syn,最後產生一個etimeout的錯誤,大概75秒左右。這個時候客戶端的預設閘道器 (192.168.1.1 211.2.2.2)因為找不到下一路由,路由器(或者再過幾跳的路由器)會產生一個EHOSTUNREACH響應給客戶端(注 意,ENETUNREACH和EHOSTUNREACH通常被認為是一個錯誤,因為ENETUNREACH一般當作已過時),由於這是個軟錯誤(有可能是 網路暫時不通造成的)。客戶端會重發syn直到超時。
        所以會有 telnet 192.168.1.55 8888  主機存在,但是埠未開,ECONRFUSED錯誤,立刻返回
                 telnet 192.168.1.56 *     主機不存在,UNROUTETOHOST錯誤,立刻返回
                 telnet 211.1.1.5    *     主機不存在,etimeout錯誤
 
      2. 最簡單的情況,伺服器主動傳送rst給客戶端關閉連線。客戶端read write直接返回rst錯誤。
 
      3. 伺服器收到一個不存在的連線返回rst響應。比如,伺服器重啟之後,先前的一個已連線的客戶端毫不之情的情況下,這就是半閉連線(跟半開連線最大的不同是,半閉連線是不能使用的,半開連線可以使用)。
       此時,如果客戶端read的話(接收緩衝無資料)產生一個EPEERRST錯誤
               如果客戶端write的話且傳送資料小於傳送緩衝區剩餘容量時,第一次write成功,第二次write或者read的時候就會產生一個 EPEERRST的錯誤。因為write傳送資料是直接把要傳送的資料拷貝到核心的tcp傳送緩衝區就立刻返回成功的。當然拷貝之前會先檢查一下tcp連 接有無錯誤。所以第二次傳送或者接收的時候,發現連線上已經有了EPEERRST的錯誤,所以就返回錯誤(話說回來,第一次傳送的資料實際上根本就沒有發 送成功,對方根本就沒接受它)