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

2021-08-18 18:22:04 字數 3137 閱讀 3034

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判斷對方關閉的唯一方法。

time_wait狀態存在的兩個理由:

如何解決伺服器端大量的time_wait狀態:

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

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三次握手四次揮手過程

tcp三次握手四次揮手過程 三次握手 在tcp ip協議中,tcp協議提供可靠的連線服務,採用三次握手建立乙個連線 第一次握手 建立連線時,客戶端傳送syn包 syn j 到伺服器,並進入syn send狀態,等待伺服器確認。第二次握手 伺服器收到syn包,必須確認客戶的syn ack j 1 同時...

TCP三次握手 四次揮手過程

tcp是面向位元組流的可靠協議,傳輸的資料單元叫報文段,報文段包括 首部和資料。序號 本報文段傳送的資料的第乙個位元組的序號 確認ack 連線請求報文段的ack 0,建立連線後ack 1 ack 1時確認號有效,ack 0時確認號無效 同步syn 當syn 1,ack 0這是連線請求報文段,若對方同...

TCP三次握手和四次揮手過程

三次握手 第一次握手 客戶端傳送syn包 syn x 到伺服器,並進入syn send狀態,等待伺服器確認 第二次握手 伺服器收到syn包,必須確認客戶的syn ack x 1 同時自己也傳送乙個syn包 syn y 即syn ack包,此時伺服器進入syn recv狀態 第三次握手 客戶端收到伺服...