tcp的粘包現象

2022-09-10 20:36:18 字數 1653 閱讀 3188

tcp的粘包現象:傳送的多條訊息在傳送到接收的過程中可能會粘在一起

只出現在tcp協議中,因為tcp協議 多條訊息之間沒有邊界,並且還有大量優化演算法

傳送端:兩條訊息很短;傳送時間間隔也非常短

接收端:多條訊息沒有及時接收,而堆積在接收方快取堆裡

如何解決:

傳送方:

1.計算即將要傳送的資料的長度,通過struct模組將長度轉換成固定的4個位元組的bytes資料

2.先傳送這固定4個位元組的bytes資料

3.再傳送指定要傳送的資料

接收方:

1.len = recv(4) 接收固定4個位元組的bytes資料

2.len = 通過struct模組將接收到的bytes資料轉換回原來的資料的長度

3.recv(len) 再接收相應長度的資料

server端**示例:

import

socket

import

struct

sk =socket.socket()

sk.bind((

'ip', port))

sk.listen()

conn, addr =sk.accept()

send_msg1 = input('

>>>

').encode('

utf-8')

send_msg2 = input('

>>>

').encode('

utf-8')

blen1 = struct.pack('i'

, len(send_msg1))

conn.send(blen1)

conn.send(send_msg1)

blen2 = struct.pack('i'

, len(send_msg2))

conn.send(blen2)

conn.send(send_msg2)

recv_msg = conn.recv(1024)

print

(recv_msg)

conn.close()

sk.close()

client端**示例:

import

socket

import

struct

sk =socket.socket()

sk.connect((

'10.11.30.149

', 9001))

blen1 = sk.recv(4)

blen1 = struct.unpack('i'

, blen1)[0]

recv_msg1 = sk.recv(blen1).decode('

utf-8')

print

(recv_msg1)

blen2 = sk.recv(4)

blen2 = struct.unpack('i'

, blen2)[0]

recv_msg2 = sk.recv(blen2).decode('

utf-8')

print

(recv_msg2)

sk.send(b

'hello')

sk.close()

tcp粘包現象

二 什麼時候需要考慮粘包問題?1 如果利用tcp每次傳送資料,就與對方建立連線,然後雙方傳送完一段資料後,就關閉連線,這樣就不會出現粘包問題 因為只有一種包結構,類似於http協議 關閉連線主要要雙方都傳送close連線 參考tcp關閉協議 如 a需要傳送一段字串給b,那麼a與b建立連線,然後傳送雙...

TCP的粘包現象

1 什麼是粘包現象 tcp粘包是指傳送方傳送的若干包資料到接收方接收時粘成一包,從接收緩衝區看,後一包資料的頭緊接著前一包資料的尾。2 為什麼出現粘包現象 1 傳送方原因 我們知道,tcp缺省會使用nagle演算法。而nagle演算法主要做兩件事 1 只有上乙個分組得到確認,才會傳送下乙個分組 2 ...

TCP的粘包現象

原文 看面經時,看到有面試官問tcp的粘包問題。想起來研一做購物車處理資料更新時遇到粘包問題,就總結一下吧。1 什麼是粘包現象 tcp粘包是指傳送方傳送的若干包資料到接收方接收時粘成一包,從接收緩衝區看,後一包資料的頭緊接著前一包資料的尾。2 為什麼出現粘包現象 1 傳送方原因 所以,正是nagle...