TCP建立與斷開連線 SOCKET通訊模板

2022-08-02 19:54:07 字數 3202 閱讀 8657

傳輸層中,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通訊模板

import

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)

print

(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()

tcp 服務端

import

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 客戶端

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...