(本文參考了《unix網路程式設計》)
主要內容分為以下兩部分:
1、tcp客戶端和伺服器一些典型事件概述;
2、tcp連線的建立和終止;
1、 1.1、tcp客戶端和伺服器一些典型事件時間表如下:
connect函式出錯時主要有以下幾種情況:
1、tcp客戶未收到syn分節的響應,返回etimedout;
2、對客戶的響應為rst,表明該伺服器在指定埠上沒有程序在等待與之連線(比如伺服器程序未啟動),稱為硬錯,客戶端會即刻返回錯誤econnrefused;
3、客戶端發出的syn在中間的路由器上引發了乙個目的地不可達icmp錯誤,稱為軟錯。此時客戶端會儲存此錯誤,並按一定時間間隔連續發出syn,若在規定時間後仍未收到響應,則把儲存的icmp錯誤作為ehostunreach或enetunreach錯誤返回給程序;
需要注意的是,當程序呼叫connect失敗後,該套介面必須關閉,如果想重新connect,需要再次呼叫socket函式。
1.3、
bind()函式會把乙個特定ip位址繫結到套介面,對於tcp客戶,此位址就是所傳送資料報的源ip位址,因為tcp伺服器的套介面只接受目的地為此ip的客戶連線。如果tcp伺服器不繫結ip,核心會把客戶所發syn所在分組的目的ip位址作為伺服器的源ip位址。
要注意的是,如果核心為套介面選擇了乙個臨時埠時,bind無法返回所選擇的值,因為第二個引數有const,可呼叫函式getsockname()返回協議位址。
1.4、
listen()函式的作用在於將乙個未連線的套介面轉變為被動套介面,並規定核心為此套介面排隊的最大連線數量。
對於給定的監聽套介面,核心要維護兩個佇列,乙個是未完成連線佇列,乙個是已完成連線佇列(已完成三次握手)。
三次握手過程如下圖示:
要注意,當乙個客戶syn到達時,若兩個佇列都是滿的,tcp會忽略此分節。且不傳送rst,讓tcp的重傳機制來處理,期待不久就可以在佇列中找到空閒條目。
1.5、
三次握手完成後而伺服器呼叫accept之前到達伺服器的資料由tcp排隊,最大資料量為已連線套介面的接收緩衝區大小。
通常我們把accept()第乙個引數稱為監聽套機口,把函式返回值稱為已連線套介面,是核心為被接受的客戶連線建立的。已連線套介面在伺服器完成該客戶的服務後會被關閉,而監聽套介面在整個伺服器有效期間都保持開放。
2、tcp連線的建立和終止,通過三次握手和四次揮手實現
2.1、三次握手過程,主要包含以下幾步:
(1)伺服器被動開啟(socket()->bind()->listen());
(2)客戶端主動開啟(socket()->connect()),此時客戶tcp向伺服器傳送乙個syn分節,它會告訴伺服器客戶將在待建立的連線中傳送的資料的初始序列號j。一般情況下,syn分節不攜帶資料,只含有乙個ip頭部、乙個tcp頭部及可能有的tcp選項;
(3)伺服器確認客戶的syn,確認號為相應syn的序列號加一(j+1),同時自己也要傳送乙個syn,含有伺服器將在同一連線中傳送資料的初始序列號(k)。伺服器以單個分節傳送syn和ack;
(4)客戶端再次確認伺服器的syn(k+1);
由於建立過程需要交換三個分組,稱為三次握手,過程圖如上所示。
2.2、四次揮手,終止乙個連線一般需要四個分節:
(1)某程序呼叫close()主動關閉(客戶端和伺服器均可以主動關閉,通常情況下是客戶端執行主動關閉),這一端的tcp傳送fin分節,表示資料傳送完畢。主動結束的這一方進入time_wait狀態;
(2)接收到fin的另一端執行被動關閉。此fin由tcp接收,其接收也作為檔案結束符傳遞給接收方應用程序(放在已排隊等候該應用程序接收的任何其他資料之後),表示在相應程序上不會再接收到資料;
(3)一段時間後,接收到檔案結束符的應用程序呼叫close()關閉套介面,其tcp同樣傳送乙個fin;
(4)接收到fin的原傳送方tcp(主動關閉的一端)對它進行確認;
有時步驟1的fin 隨資料一起傳送,tcp在步驟2和3發出的ack和fin也可以合併到乙個分節,所以不一定每一次的終止都需要四個分節。過程圖如下:
TCP的建立和終止
先看看tcp的狀態變遷圖 tcp ip詳解上面的原圖,來自google 下面就圖中涉及到的問題做一些說明。下面是tcp連線建立與終止的時候的時序圖 在tcp ip協議中,tcp協議提供可靠的連線服務,採用三次握手建立乙個連線 1 第一次握手 建立連線時,客戶端a傳送syn包 syn j 到伺服器b,...
TCP 連線的建立和終止
1.伺服器通過呼叫socket,bind和listen三個函式準備接受外來連線,稱為被動開啟。2.客戶通過呼叫connect發起主動開啟,導致客戶tcp傳送乙個syn同步分節,告訴伺服器將在連線中傳送的資料的初始序列號。syn分節不包含資料,只包含乙個ip首部,乙個tcp首部及可能的tcp選項。3....
TCP連線建立和終止小結
如圖 1.請求端傳送乙個syn到伺服器的相應埠,以及初始序號isn 2.伺服器傳送包含伺服器的初始序號的syn作為應答,同時確認序號設定為客戶的isn 1 3.客戶將確認序號設定為伺服器的isn 1 最大報文段長度 mss 同時開啟 一般情況下,連線建立時是一方傳送syn,另一方傳送syn ack,...