拿python的socket來實作遊戲的傳輸協定,把過程中需要注意的部份記錄下來
TCP封包可能會含有多個封包(小封包合成一個送出),或者大封包拆分等情況。針對這狀況的解決辦法是把封包長度附在資料內。
UDP封包不會有合成小封包的情形,但因為UDP封包不保證收到順序,所以在重視順序的狀況不會採用它。
另外socket在接收封包也有它的大小限制
乙太網單一封包最大值,1500 bytes
TCP單一封包最大值,64 kb
Python socket receive - incoming packets always have a different size via stackOverflow
這篇提到 socket.recv(n) 代表它單次最多接收大小在n以內的封包。
常見的封包定義:
長度,內文
內文格式:
內容類型,附帶參數
這篇範例 說明了TCP處理封包拆分和組合的處理過程。
造成封包合併的原因是TCP的Nagle演算法,當初的目的是減少1位元組的小封包消耗網路頻寬,但連帶的就是程式需要額外處理合併封包的拆分問題。
因此也去找了一下在python socket內關閉nagle演算法的選項,詳細可參考這篇sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, True)
加入此段程式碼就可以了
查完資料的感想是,TCP協議畢竟還是steam(沒有起點和終點),用它接收資料最好還是要告知封包大小。才能根本解決封包的問題。
另外找資料過程有看到的
網路底層的東西蠻多細節的,加油加油
每天進步一些:)