tcp終止連線需要4個分節,簡稱四次握手。
首先要明確的概念是:當一對tcp sockets建立了連線,客戶和伺服器是對等的,沒有區別;
tcp連線是雙工的,所以一條連線其實是「兩條單向的連線」
連線的終止:
1. 主動方發出設定了fin位的報文,表示主動終止從本地到遠端的單向連線;
此時,主動方進入fin_wait1狀態,意思就是它在等待遠端的fin報文;
2. 遠端收到fin後,會立即傳送ack;主動方收到ack後,進入fin wait2狀態,所以fin-wait1狀態持續的非常短;
此時遠端進入close-wait狀態,一條單向連線終止了,但另一條還沒有,處於half-close連線狀態;
3.當遠端進行了必要的資料傳送後,它傳送fin,表示從它出發的單向連線也要關閉;同時它進入last ack狀態;
4.主動方收到fin後,回應乙個ack;遠端就此進入closed狀態,連線關閉;
5.主動方進入time wait狀態;確保最後乙個ack沒有丟失,防止新連線占用剛剛關閉的主動方的位址埠,使得網路中流浪的老連線的分組被誤認為新連線的分組。
補概念:
半開連線:一方已經關閉或異常終止連線,但另一方卻不知道。比如某端突然斷電了,另一端是無法感知的。
1,只要tcp的緩衝裡還有未讀取(read)資料,則呼叫close時會直接向對端傳送rst。
2,shutdown與socket描述符沒有關係,即使呼叫shutdown(fd, shut_rdwr)也不會關閉fd,最終還需close(fd)。
3,在已傳送fin包後write該socket描述符會引發epipe/sigpipe。
4,當有多個socket描述符指向同一socket物件時,呼叫close時首先會遞減該物件的引用計數,計數為0時才會傳送fin包結束tcp連線。shutdown不同,只要以shut_wr/shut_rdwr方式呼叫即傳送fin包。
5,so_linger與close,當so_linger選項開啟但超時值為0時,呼叫close直接傳送rst(這樣可以避免進入time_wait狀態,但破壞了tcp協議的正常工作方式),so_linger對shutdown無影響。
6,tcp連線上出現rst與隨後可能的time_wait狀態沒有直接關係,主動發fin包方必然會進入time_wait狀態,除非不傳送fin而直接以傳送rst結束連線
unix網路程式設計第一卷;
用tcp進行網際互聯第一卷
附一條有用的tcpdump指令:
tcpdump -s0 -xn -i any udp and ip[0x29:4]=831010004
抓udp包,且從第0x29位元組開始的連續4位元組值為831010004的包;
TCP的連線與終止
t c p將使用者資料打包構成報文段 它傳送資料後啟動乙個定時器 另一端對收到的資料進行確認,對失序的資料重新排序,丟棄重複資料 t c p提供端到端的流量控制,並計算和驗證乙個強制性的端到端檢驗和。導致兩個進入established狀態的變遷對應開啟乙個連線,而兩個導致從established狀態...
TCP的連線與終止
一 三次握手 1 伺服器必須準備好接受外來的連線。這通常通過呼叫socket bind和listen這三個函式來完成,我們稱之為被動開啟。2 客戶端通過呼叫connect發起主動開啟。這導致客戶tcp傳送乙個syn 同步 位元組,它告訴伺服器客戶將在 待建立 連線傳送的資料的初始序列號。通常syn分...
TCP的連線與終止
tcp的連線與終止 1.tcp報頭 t c p將使用者資料打包構成報文段 它傳送資料後啟動乙個定時器 另一端對收到的資料進行確認,對失序的資料重新排序,丟棄重複資料 t c p提供端到端的流量控制,並計算和驗證乙個強制性的端到端檢驗和。2.tcp連線的建立與終止 3.tcp的狀態變遷 導致兩個進入e...