Python socket發送封包有很多種方式和API,例如send、sendto、sendall等等,如果你的socket是TCP的socket,那麼在接收到client的封包要回傳,只需要一行程式,參數放字串就能搞定了!sock.send(“Hello world!”)
如果是UDP也很簡單,但是UDP是無連結的協議,所以需要加ip和portsock.sendto(“Hello world!”, (addr, port))
那我們這個系列的socket是什麼樣的socket呢?給大家複習一下s = socket.socket( socket.AF_PACKET , socket.SOCK_RAW , socket.ntohs(0x0003))
是最原始的socket!雖然他發送和tcp一樣,也是s.send(string),但是裡面的string函數就非常複雜啦,必須從最上層一路加header到鏈接層,最重要的是,如果經過路由器的話,第三層IP層的checksum還要自己計算!每個路由器都會計算checksum以保證封包不會在傳輸過程中出現錯誤,但是checksum的計算方式過於簡單,難免還是有”bug”,這將在下一節提到,這一節,先給大家介紹如何建構發送出的packet
一個packet長這樣{Header}{Header}{Header}{Data}
Data隨意放就好,看你的應用的資料格式,主要是怎麼建構header,因為header的原始格式是C裡的struct的byte array
其實也很簡單,如果拆解一個header是這樣的a, b ,c d = struct.unpack(“BBHH”, header)
那把他架構回去就是這樣header = struct(“BBHH”, a, b ,c ,d)
建構完多個header,只要把這些連接在一起就能發送了!路由器和交換機就能根據IP和MAC找到目的地電腦並解析封包s.send(header1 + header2 + header3 + data)
系列的成果將會放在這:https://github.com/kaichiachen/pytcpdump
文章配合著程式碼有助於學習 :)