傳輸層中,tcp建立傳輸鏈結時的三次握手和關閉鏈結的四次揮手,因為socket工作於應用層和傳輸層之間,所以涉及建立鏈結和關閉鏈結的過程
tcp使用視窗機制進行流量控制,什麼是視窗?
連線建立時,各端分配一塊緩衝區用來儲存接收的資料,並將緩衝區的尺寸傳送給另一端;接收方傳送的確認資訊中包含了自己剩餘的緩衝區尺寸;剩餘緩衝區空間的數量叫做視窗
listen - 伺服器偵聽來自客戶端tcp埠的連線請求;
syn-sent - 客戶端在傳送連線請求後等待匹配的連線請求;
syn-received - 伺服器在收到和傳送乙個連線請求後等待對連線請求的確認;
established- 代表乙個開啟的連線,資料可以傳送給使用者;
fin-wait-1 - 等待遠端tcp的連線中斷請求,或先前的連線中斷請求的確認;
close-wait - 等待從本地使用者發來的連線中斷請求;
fin-wait-2 - 從遠端tcp等待 連線中斷請求;
last-ack - 等待原來發向遠端tcp的連線中斷請求的確認;
time-wait - 等待足夠的時間以確保遠端tcp接收到連線中斷請求的確認;
closed - 關閉,沒有任何連線狀態;
三次握手:
tcp/ip協議中,tcp協議採用三次握手建立乙個連線。
(1)第一次握手:建立連線時,客戶端a傳送syn包(syn=j)到伺服器b,並進入syn_send狀態,等待伺服器b確認。
(2)第二次握手:伺服器b收到syn包,必須確認客戶a的syn(ack=j+1),同時自己也傳送乙個syn包(syn=k),即syn+ack包,此時伺服器b進入syn_recv狀態。
(3)第三次握手:客戶端a收到伺服器b的syn+ack包,向伺服器b傳送確認包ack(ack=k+1),此包傳送完畢,客戶端a和伺服器b進入established狀態,完成三次握手。
完成三次握手,客戶端與伺服器開始傳送資料。
四次揮手:
tcp協議的連線是全雙工連線,乙個tcp連線存在雙向的讀寫通道。tcp的連線的拆除需要傳送四個包,因此稱為四次揮手(four-way handshake)。
客戶端或伺服器均可主動發起揮手動作,在socket程式設計中,任何一方執行close()操作即可產生揮手操作。
詳細過程:
第一階段 客戶機傳送完資料之後,向伺服器傳送乙個fin資料段,序列號為i;
1.伺服器收到fin(i)後,返回確認段ack,序列號為i+1,關閉伺服器讀通道;
2.客戶機收到ack(i+1)後,關閉客戶機寫信道;
(此時,客戶機仍能通過讀通道讀取伺服器的資料,伺服器仍能通過寫信道寫資料)
第二階段 伺服器傳送完資料之後,向客戶機傳送乙個fin資料段,序列號為j;
3.客戶機收到fin(j)後,返回確認段ack,序列號為j+1,關閉客戶機讀通道;
4.伺服器收到ack(j+1)後,關閉伺服器寫信道。
這是標準的tcp關閉兩個階段,伺服器和客戶機都可以發起關閉,完全對稱。
fin標識是通過傳送最後一塊資料時設定的,標準的例子中,伺服器還在傳送資料,所以要等到傳送完的時候,設定fin(此時可稱為tcp連線處於半關閉狀態,因為資料仍可從被動關閉一方向主動關閉方傳送)。
socket通訊模板
importtcp 服務端socket#建立
server =socket.socket()#繫結
server.bind(("
192.168.12.154
", 20000))#監聽
server.listen() #
指定半連線數 預設則由作業系統決定
while
true:
#接收,client:客戶端的client物件 type為,addr:客戶端的("ip",埠號)
client, addr =server.accept()
while
true:
#捕獲異常 主要有 客戶端強行關閉
try:
#接收訊息 可以理解為 雙向通訊,在服務端有個client的同類負責和客戶端裡自己的同類交流 server請了個助手
data = client.recv(1024)
(type(client), addr)
ifnot data: #
避免客戶端正常close()後 沒有send 但是服務端某種情況下不斷執行data = client.recv(1024) 列印空data
client.close()
break
print("
來自客戶端:
", data.decode("
utf8"))
#反饋訊息
client.send(input("
>>>
").encode("
utf8"))
except
connectionreseterror:
print("
客戶端強行終止了通訊")
client.close()
break
#while true在實際中是有條件終止的 終止後需要執行close()
server.close()
importtcp 客戶端socket#建立
client =socket.socket()
#連線服務端
client.connect(("
192.168.12.154
", 20000))
while
true:
msg = input("
>>>")
#傳送client.send(msg.encode("
utf8"))
#接收服務端回執的資料
data = client.recv(1024)
print("
服務端:
", data.decode("
utf8"))
#while true在實際中是有條件終止的 終止後需要執行close()
client.close()
TCP連線建立與斷開
重點關注標記 三次握手確認建立雙向連線 男 我們談朋友吧!syn 女 談朋友,好的!syn ack 男 好的!ack ps 如男方後悔了另謀物件,沒有第三次確認,那麼女方就是單方面確認談朋友,建立了髒連線。四次揮手確認斷開連線 男 我們分手吧!fin 女 好的,等我收拾完東西發訊息給你 此時男不能再...
TCP詳解 連線建立與斷開
一 報文結構介紹 在開始講tcp連線過程時,還是先看看tcp報文的格式如圖1所示。ip資料報此時由ip頭部 tcp頭部 tcp資料組成。不帶選項的tcp頭部是20位元組長,而帶選項的,tcp頭部最長可達60位元組。常見的選項包括最大的大小 mss 時間戳 傳輸控制時使用 視窗縮放 流量控制時使用 選...
TCP建立連線與斷開連線的過程
在cs模式的tcp連線建立過程中,客戶端與伺服器端流程如下 客戶端流程 傳送請求 接收伺服器端確認 傳送對伺服器端確認的確認。伺服器端流程 接收客戶端的連線建立請求 傳送確認 接收客戶端傳送的對確認的確認。1 剛開始客戶端和服務端都處於closed狀態,服務端開始監聽某個埠,進入listen狀態。2...