iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 17
0
自我挑戰組

卡牌遊戲開發日記v2020系列 第 17

Day17 從零開始弄socket傳輸

  • 分享至 

  • xImage
  •  

拿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(沒有起點和終點),用它接收資料最好還是要告知封包大小。才能根本解決封包的問題。

另外找資料過程有看到的

網路底層的東西蠻多細節的,加油加油
每天進步一些:)


上一篇
Day16 構想: socket send/recv
下一篇
Day18 從零開始弄socket傳輸-2
系列文
卡牌遊戲開發日記v202030
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言