UDP簡介
UDP是一個簡單的面向數據報的運輸層協議。UDP數據報包含UDP首部和數據兩部分。UDP的首部結構如下圖:
端口號標識發送進程和接收進程。UDP長度字段指的是UDP首部和UDP數據的字節長度。UDP檢驗和覆蓋UDP首部和UDP數據,UDP的檢驗和是可選的。UDP檢驗和是一個端到端的檢驗和。
在網絡中數據的傳輸,需要知道計算機的地址,計算機的地址就是ip地址。進程會產生UDP數據報,並封裝成IP數據報進行傳輸。
UDP協議是不可靠的,只負責將數據發送出去,並不保證到達目的地。
簡單實例
window的ip爲192.168.1.27,linux的ip爲192.168.190.144,window向linux發送UDP請求。
import socket
def send_msg(udp_socket):
"""發送消息"""
dest_ip = input("請輸入對方的ip:")
dest_port = int(input("請輸入對方的port:"))
send_data = input("請輸入要發送的消息:")
udp_socket.sendto(send_data.encode("utf-8"), (dest_ip, dest_port))
def recv_msg(udp_socket):
"""接收數據"""
recv_data = udp_socket.recvfrom(1024)
print("%s:%s" % (str(recv_data[1]), recv_data[0].decode("utf-8")))
def main():
# 創建套接字
udp_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 綁定端口
udp_socket.bind(('192.168.1.27',7788))
while True:
send_msg(udp_socket)
recv_msg(udp_socket)
if __name__=="__main__":
main()
window向linux中指定端口傳入數據:
從在linux中用抓包工具抓到的數據包可以看出有UDP相關的包傳入linux中。
[root@mdw tmp]# tcpdump -i eth2 -nn udp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth2, link-type EN10MB (Ethernet), capture size 65535 bytes
19:14:57.294420 IP 192.168.190.1.63986 > 239.255.255.250.1900: UDP, length 174
19:14:58.295971 IP 192.168.190.1.63986 > 239.255.255.250.1900: UDP, length 174
19:14:59.296365 IP 192.168.190.1.63986 > 239.255.255.250.1900: UDP, length 174
19:15:00.297296 IP 192.168.190.1.63986 > 239.255.255.250.1900: UDP, length 174
前面的例子是一個單向的傳輸。接下來看一下雙向的信息傳輸:
發送方:
import socket
def send_msg(udp_socket):
"""發送消息"""
dest_ip = input("請輸入對方的ip:")
dest_port = int(input("請輸入對方的port:"))
send_data = input("請輸入要發送的消息:")
udp_socket.sendto(send_data.encode("utf-8"), (dest_ip, dest_port))
def recv_msg(udp_socket):
"""接收數據"""
recv_data = udp_socket.recvfrom(1024)
print("%s:%s" % (str(recv_data[1]), recv_data[0].decode("utf-8")))
def main():
# 創建套接字
udp_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 綁定端口
udp_socket.bind(('127.0.0.1',7788))
while True:
send_msg(udp_socket)
recv_msg(udp_socket)
if __name__=="__main__":
main()
接收方:
import socket
def send_msg(udp_socket):
dest_ip = "127.0.0.1"
dest_port = 7788
send_data = input("Please input you want to speak:")
udp_socket.sendto(send_data.encode("utf-8"), (dest_ip, dest_port))
def recv_msg(udp_socket):
recv_data = udp_socket.recvfrom(1024)
print("%s:%s" % (str(recv_data[1]), recv_data[0].decode("utf-8")))
def main():
udp_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
udp_socket.bind(('127.0.0.1',7799))
while True:
recv_msg(udp_socket)
send_msg(udp_socket)
if __name__=="__main__":
main()
發送方:
接收方: