1. 程式人生 > >TCP三次握手和四次揮手過程及套接字選項

TCP三次握手和四次揮手過程及套接字選項

三次握手

1)伺服器必須準備好接受外來的連線。這通常在呼叫socket,bind,listen這三個函式來完成,我們稱之為被動開啟(passive open)。

(2)客戶通過呼叫socket,connect發起主動開啟(active open)。這導致客戶tcp傳送一個SYN(同步)分節,它告訴伺服器客戶將在待建立的tcp連線中傳送資料的初始序列號。通常SYN分節不攜帶資料,其所在的IP資料報只包含有一個IP首部、一個TCP首部及可能有的TCP選項。

(3)伺服器必須確認(ACK)客戶的SYN,同時自己也得傳送一個SYN分節,它含有伺服器將在同一連線中傳送的資料的初始序列號。伺服器在單個分節中傳送SYN和對客戶SYN的ACK(確認)。

(4)客戶必須確認伺服器的SYN(SYN設計成佔用一位元組,所以必須相應)。

這種交換至少需要三個分組,因此稱之為TCP的三路握手。
這裡寫圖片描述

在TCP首部中包含有兩個重要資訊。
這裡寫圖片描述
上圖中注意確認序號和序號是分開的,所以可以在傳送資料的同時確認也可以。

1、握手交換了雙方初始化的報文序列號。
2、交換了各自接收區滑動視窗的大小。

四次斷開

TCP建立一個連線需要3個分節,而終止一個連線一般需要4個分節,所以一般也稱為四路揮手。

   (1)某個應用程序首先呼叫close,我們稱為該端執行主動關閉(active close),該端的tcp於是傳送一個FIN分節,表示資料傳送完畢。

   (2)接收到這個FIN的對端執行被動關閉(passive close)。這個FIN由tcp確認。它的接受也作為一個檔案結束符傳遞給接收端的應用程序(放在已排隊等候該應用程序接受的任何其他資料之後),因為FIN的接受意味著接收端應用程序在相應的連線上再無額外資料可接受。

   (3)一段時間後,接受到這個檔案結束符的應用程序將呼叫close關閉它的套接字。這導致它的tcp也傳送一個FIN分節。

           注:為什麼是需要一段時候後,我的理解是由於接收到的fin分節作為一個檔案結束符放在已排隊等候應用程序接受的所有資料之後,而應用程序呼叫read讀取資料得等它把這個檔案描述符之前的所有資料讀取完後,才能讀取到該檔案描述符,此時read返回0,所以此時應用程序才知道對端已關閉了套接字,進而它也呼叫close關閉套接字,這裡可以通過epoll得到。

    (4)接受這個最終FIN的原發送端tcp(即執行主動關閉的那一端)確認這個FIN。

既然每個方向都需要一個FIN和一個ACK,因此通常需要4個分節。我們使用限定詞 “通常”
是因為某些情形下步驟1的FlN隨資料一起傳送,另外步驟2和步驟3傳送的分節都出自執行
被動關閉那一端,有可能被合併成一個分節。

這裡寫圖片描述
判斷read返回0,很重要。則是select判斷對方關閉的唯一方法。

3、TIME_WAIT

TIME_WAIT狀態存在的兩個理由:
這裡寫圖片描述

如何解決伺服器端大量的TIME_WAIT狀態:
當測試伺服器端的時候,主動關閉了,IP地址某個埠的連線,下次在一點時間之內,bind執行會失敗,這是因為此連線暫時處於TIME_WAIT狀態,TCP協議棧禁止連線。所以這時候就需要採取措施了。

4、套接字選項

1、SO_REUSEADDR
SO_REUSEADDR套接字選項能起到以下4個不同的功用。
(1) SO_REUSEADDR允許啟動一個監聽伺服器並捆綁其眾所周知埠,即使以前建立的將該埠用作它們的本地埠的連線仍存在。這個條件通常是這樣碰到的:
a) 啟動一個監聽伺服器。
b) 連線請求到達,派生一個子程序來處理,這個客戶。
c) 監昕伺服器終止,但子程序繼續為現有連線上的客戶提供服務。
d) 重啟監聽伺服器。
預設情況下,當監聽伺服器在步驟d通過呼叫socket、bind和listen重新啟動時,由於它試圖捆綁一個現有連線(即正由早先派生的那個子程序處理著的連線)上的埠,從而bind呼叫會失敗。但是如果該伺服器在socket和bind兩個呼叫之間設定了SO_REUSEADDR套接字選項,那麼bind將成功。所有TCP伺服器都應該指定本套接字選項,以允許伺服器在這種情形下被重新啟動。

2、SO_KEEPALIVE

TCP連線,如果沒有主動斷開,並給一個TCP套接字設定保持存活(keep-alive)選項後,如果2小時內在該套接字的任一方向上都沒有資料交換,TCP就自動給對端傳送一個保持存活探測分節(keep-alive probe )。這是一個對端必須響應的TCP分節,它會導致以下三種情況之一 :

(1)對端以期望的ACK響應,應用程序得不到通知(因為一切正常,繼續處於連線狀態)。在又經過仍無動靜的2小時後,TCP將發出另 一個探測分節。

(2)對端以RST(你給我發個毛啊,都已經斷開了,快點,來給我重新握手)響應,它告知本端TCP:對端己崩潰或已經重新新啟動.。該套接字的待處理錯誤被置為ECONNRESET,套接字本身則被關閉。

(3)對端對保持存活探測分節沒有任何響應。TCP將另外發送8個探測分節,兩兩相隔75秒,試圖得到一個響應,TCP在發出第一個探測分節後11分15秒內若沒有得到任何響應則放棄,套接字錯誤為ETINEOUT,套接字本身則被關閉。

(4)如果該套接字收到一個ICMP錯誤作為某個探測分節的響應,那就返回相應的錯誤,套接字本身也被關閉。這種情形下一個常見的ICMP錯誤是 “host unreachable” (主機不可達) ,說明對端主機可能並沒有崩潰,只是不可達,這種情況下待處理錯誤被置為EHOSTUNREACH。發生這種情況的原因或者是發生網路故障,或者是對端主機己經崩
潰,而最後一跳的路由器也已經檢測到它的崩潰。

3、TCP套接字TCP_NODELAY
開啟本選項將禁止TCP的Nagle演算法。Nagle演算法的目的在於減少廣域網 (WAN) 上小分組的數目。互動式資料流會帶來相應遲緩的問題。

相關推薦

TCP握手揮手過程選項

三次握手 1)伺服器必須準備好接受外來的連線。這通常在呼叫socket,bind,listen這三個函式來完成,我們稱之為被動開啟(passive open)。 (2)客戶通過呼叫socket,connect發起主動開啟(active open)。這導致客戶

TCP協議的握手揮手

揮手 這一 nbsp 服務端 msl cnblogs chm 可靠的 不相信 TCP報文段格式圖: 序號:seq序號,用來標識從TCP源端向目的端發送的字節流,發起方發送數據時對此進行標記。 確認號:ack序號,只有ACK標誌位為1時,確認序號字段才有效,Ack=seq+1

TCP握手揮手

tcp握手和揮手TCP報文的頭部信息: SEQ SYN ACK FIN此時會用上ACK : TCP協議規定,只有ACK=1時有效,也規定連接建立後所有發送的報文的ACK必須為1SYN(SYNchronization) : 在連接建立時用來同步序號。當SYN=1而ACK=0時,表明這是一個連接請求報文。對方若同

TCP握手揮手

可能 事情 斷開 fin 最長 time 重復 延時 cnblogs 三次握手 TCP連接是通過三次握手來連接的。 第一次握手 當客戶端向服務器發起連接請求時,客戶端會發送同步序列標號SYN到服務器,在這裏我們設SYN為m,等待服務器確認,這時客戶端的狀態為SYN_SENT

TCP握手揮手過程

-1 連接狀態 字段 osi listen 情況 time 連接 -a TCP包頭:其中ACK,SYN,FIN在這兩個過程中會用到,簡單介紹如下: ACK:表示是否前面的確認號字段是否有效,ACK=1,表示有效,只有當ACK=1時,前面的確認號字段才有效,TCP規

TCP握手揮手詳解

tcp三次握手和四次揮手詳解TCP(Transmission Control Protocol)網絡傳輸控制協議,是一種面向連接的、可靠的、基於字節流的傳輸層通信協議,數據傳輸前建立連接的工作要經過三次握手,數據傳輸後斷開連接的工作要經過四次揮手。工作過程TCP標誌位:TCP共有6個標誌位,分別是:SYN(s

TCP協議中的握手揮手(圖解)(轉)

繼續 丟失 get 所有 如果 idt 請求報文 網絡 center 轉自:http://blog.csdn.net/whuslei/article/details/6667471 建立TCP需要三次握手才能建立,而斷開連接則需要四次握手。整個過程如下圖所示: 先來看看如

真的懂了:TCP協議中的三次握手和四次揮手(關閉連時, 當收到對方的FIN報文時, 僅僅表示對方不在發送數據了, 但是還能接收數據, 己方也未必全部數據都發送對方了。相當於一開始還沒上話不要緊,後來上話以後得讓人把話講完)

流程圖 .cn 服務 soc knowledge ber tcp連接 是什麽 一次 一、TCP報文格式   下面是TCP報文格式圖:              (1) 序號, Seq(Sequence number), 占32位,用來標識從TCP源端向目的端發送的字節

TCP握手揮手以及11種狀態

tcp soc 客戶端請求 3次握手 ast ket 監聽 服務 標識 TCP三次握手和四次揮手以及11種狀態 1、三次握手 置位概念:根據TCP的包頭字段,存在3個重要的標識ACK、SYN、FIN ACK:表示驗證字段 SYN:位數置1,表示建立TCP連接 FIN:位數置

使用 WireShark 分析 TCP/IP 握手 揮手

vertical 客戶端 我們 訪問 out 完成 strong 開始 概覽 TCP 三次握手 示意圖 Wireshark 抓包註意事項 為了演示一個TCP三次握手建立連接的過程,我們通過 Chrome 訪問一個網頁。 已知 HTTP 協議就是建立在TCP鏈接上的

tcp、的握手揮手

.com 服務端 server 成功 四次揮手 fin CP 產生一個隨機數 再次 TCP 三次握手第一次: 客戶端將標誌位SYN置為1,隨機產生一個值seq=x,並將該數據包發送給服務端,客戶端進入等待狀態,等待服務端確認。第二次: 服務端收到數據包後確認SYN=1

TCP/IP協議握手揮手大白話解說

ini 存在 detail 系統 超時 定時 com 又能 ssi TCP/IP協議三次握手和四次揮手大白話解說 前言 昨天晚上被一位師傅問到了TCP/IP的工作機制,心裏很清楚三次握手,然而對於四次揮手卻忘了,這是大學習裏學過的,奮而翻閱書籍和網絡對之前所學的做一個溫

TCP握手揮手學習

意思 手動 斷開 arch sha etime 揮手 HA 等待 所謂三次握手(Three-way Handshake),是指建立一個TCP連接時,需要客戶端和服務器總共發送4個包(兩個SYN,兩個ACK); 第一次握手:當客戶端向服務器發起連接請求時,客戶端會發送同步序

腦殘式網絡編程入門(一):跟著動畫來學TCP握手揮手

syn 批量 一點 sock 基於 網絡編程 中間件 分析 著名 、引言 網絡編程中TCP協議的三次握手和四次揮手的問題,在面試中是最為常見的知識點之一。很多讀者都知道“三次”和“四次”,但是如果問深入一點,他們往往都無法作出準確回答。 本篇文章嘗試使用動畫圖片的方式,來對

Python中的TCP握手揮手過程

時間 斷開連接 產生 等待 ip地址 狀態 ima ack 丟失 tcp三次握手和四次揮手 首先先介紹什麽是傳輸層: 1、三次握手 1) 三次握手的詳述 首先Client(客戶)端發送連接請求報文,Server(服務器)段接受連接後回復ACK報文,並為這

TCP握手揮手【轉】

prot 說明 的確 應用程序 二次 負責 序列 簡單網絡管理 igmp 一. TCP/IP協議族 TCP/IP是一個協議族,通常分不同層次進行開發,每個層次負責不同的通信功能。包含以下四個層次: 1. 鏈路層,也稱作數據鏈路層或者網絡接口層

文字版 描述TCP握手揮手以及有限狀態機等

切換 list 遠方 是什麽 int last 關閉 ive tcp報文 客戶端和服務器 ,雙方都處於第一次交互的情況下展開通信 三次握手 1.首先 服務器 需要是處於listen收聽狀態下才能接受報文客戶端由closed狀態 打開並向服務器發送報文SYN=1 申請建

計算機網絡--TCP握手揮手

int 主動 prot 序列 等我 方便 連接狀態 結點 可靠的 TCP(傳輸控制協議)   TCP(Transmission Control Protocol 傳輸控制協議)是一種面向連接的、可靠的、基於字節流的傳輸層通信協議。通過三次握手建立連接,通訊完成時要拆除連接,

TCP協議的握手揮手(詳細圖解)

TCP的概述 TCP把連線作為最基本的物件,每一條TCP連線都有兩個端點,這種斷點我們叫作套接字(socket),它的定義為埠號拼接到IP地址即構成了套接字,例如,若IP地址為192.3.4.16 而埠號為80,那麼得到的套接字為192.3.4.16:80。  T

TCP握手揮手機制

1、三次握手 (1)三次握手的詳述 首先Client端傳送連線請求報文,Server段接受連線後回覆ACK報文,併為這次連線分配資源。Client端接收到ACK報文後也向Server段發生ACK報文,並分配資源,這樣TCP連線就建立了。    最初兩端的TCP