当前位置:   article > 正文

计算机网络编程——UDP详解_udp在传送数据之前不需要建立连接吗

udp在传送数据之前不需要建立连接吗

1.UDP协议的概述

UDP(User Datagram Protocol)是一种在网络通信中使用的传输层协议。与TCP(Transmission Control Protocol)相比,UDP是一种无连接的协议,这意味着它不像TCP那样在通信的开始和结束时需要建立和终止连接。

2.UDP协议的特点

 

  1. 无连接性: UDP是无连接的协议,这意味着通信的双方不需要在通信之前建立连接。每个UDP数据报都是独立的,它们可以单独发送,没有依赖关系。

  2. 不可靠性: UDP不提供数据传输的可靠性保证。它不会像TCP那样提供重传、确认和流量控制等机制。这意味着如果发送的数据丢失或者损坏,UDP不会自动重新发送,需要应用层自行处理。

  3. 速度和低延迟: 由于没有连接状态维护和复杂的确认机制,UDP的开销比TCP小,因此在速度和延迟方面表现更好。这使得它适用于实时应用,如语音通话和在线游戏。

  4. 数据报格式: UDP数据报包含了目标端口号和源端口号,这些信息用于将数据传递给正确的应用程序。但是,数据报本身没有保证按顺序到达或完整到达。

  5. 无拥塞控制: UDP不具备TCP的拥塞控制机制,因此在网络拥塞的情况下,UDP数据报可能会丢失或延迟增加。

  6. 广播和多播支持: UDP支持向特定组中的多个主机发送数据,这称为多播(Multicast)。也可以将数据报广播到网络中的所有主机,这称为广播(Broadcast)。

  7. 适用场景: UDP适用于需要快速传输和实时性要求较高的应用,如语音和视频流、在线游戏、实时传感数据等。它不适用于需要可靠传输和数据完整性的场景,因为这些方面没有被UDP提供。

3.UDP的格式

 

 

4.网络编程 

我是在同一局域网下两台电脑实现的通信,一台是服务器,一台是客户端 

你可以借用你室友的电脑,条件是在同一局域网,连同一个wifi就行,如果没条件的同学也可以把ip换成本地ip,本地测试。

server_address = ('127.0.0.1', 12345)

客服端代码

  1. import socket
  2. import time
  3. # 定义服务器地址和端口
  4. server_address = ('192.168.31.54', 12345)
  5. # 创建 UDP 客户端套接字
  6. client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  7. try:
  8. send_time = time.time()
  9. message = "祖国必定统一!"
  10. client_socket.sendto(message.encode(), server_address)
  11. #接收数据
  12. data,server = client_socket.recvfrom(1024)
  13. receive_time = time.time()
  14. #计算延迟
  15. delay = receive_time - send_time
  16. print("收到数据:", data.decode())
  17. print("通信延迟:", delay, "秒")
  18. finally:
  19. client_socket.close()

服务器ip地址192.168.31.54 端口号:12345 

服务端代码

 

  1. import socket
  2. # 绑定服务器地址和端口
  3. server_address = ('192.168.31.54', 12345) # 留空表示绑定到所有可用接口
  4. server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  5. server_socket.bind(server_address)
  6. print("等待客户端连接...")
  7. try:
  8. data, address = server_socket.recvfrom(1024)
  9. print("收到数据:", data.decode())
  10. # 发送数据
  11. response = "hello from server!"
  12. server_socket.sendto(response.encode(), address)
  13. finally:
  14. server_socket.close()

先运行服务端,在开启客户端。

服务端运行结果

 

客户端运行结果 

 

5.数据抓包 

 在运行服务端之前开启抓包

 

抓包的数据保存在这里了。

电脑进程会调用12345端口,查询udp协议,端口12345产生的数据包。

 

 

 

 

 

  • Internet Protocol Version 4: 这表示这是一个IPv4数据包,与之前描述的类似,是一种在互联网上传输数据的常见协议。

  • Src: 192.168.31.46: 这是源IP地址,表示数据包的发送方的唯一标识。在你的数据中,源IP地址是 192.168.31.46。

  • Dst: 192.168.31.54: 这是目标IP地址,表示数据包的接收方的唯一标识。在你的数据中,目标IP地址是 192.168.31.54。

  • Version: 4: 这是IP协议的版本,表示这是IPv4。

  • Header Length: 20 bytes (5): 这是IP头部的长度,以字节为单位。在你的数据中,IP头部的长度是20字节。

  • Differentiated Services Field: 这是用于指示数据包优先级和服务质量的字段。在你的数据中,DSCP(DiffServ Code Point)被设置为0,表示默认服务。

  • Total Length: 49: 这是整个IP数据包的长度,以字节为单位。在你的数据中,数据包的长度是49字节。

  • Identification: 0x4ec2 (20162): 这是一个用于分片和重组数据包的标识字段。

  • Flags: 0x0000: 这是用于分片和重组的标志字段。

  • Time to live: 128: 这是数据包的生存时间,类似之前的描述。

  • Protocol: UDP (17): 这表示数据包中封装的是UDP协议的数据。

  • Header checksum: 这是IP头部的校验和,与之前的描述类似。

  • Source: 192.168.31.46: 这是源IP地址。

  • Destination: 192.168.31.54: 这是目标IP地址。

  • 5c ba ef 2a ea 63: 这是目标MAC地址,也就是数据帧的目标设备的MAC地址。

  • 50 28 4a eb 78 e1: 这是源MAC地址,也就是数据帧的发送设备的MAC地址。

  • 08 00: 这是帧类型字段,指示以太网帧中的上层协议是IPv4。

  • 45 00: 这是IP首部的起始,表示IPv4版本和首部长度。

  • 00 2e: 这是IP数据报的总长度。

  • 35 7d: 这是标识字段,用于分片和重组数据报。

  • 00 00: 这是标志和片偏移字段。

  • 80 11: 这是TTL和上层协议字段,表明上层协议是UDP。

  • 45 8d: 这是IP首部校验和。

  • c0 a8 1f 36: 这是源IP地址,表示数据报的发送方IP地址。

  • c0 a8 1f 2e: 这是目标IP地址,表示数据报的接收方IP地址。

  • 30 39: 这是源端口号,表示UDP数据报的发送方端口号。

  • ed 4b: 这是目标端口号,表示UDP数据报的接收方端口号。

  • 00 1a: 这是UDP数据报的长度。

  • ba 41: 这是UDP校验和。

 

 

数据部分:

e7a596e59bbde5bf85e5ae9ae7bb9fe4b880efbc81

 

 

 

 

 

数据部分:48 65 6c 6c 6f 20 66 72 6f 6d 20 73 65 72 76 65 72 21

  1. hex_string = "48656c6c6f2066726f6d2073657276657221"

    • 这行代码将一个十六进制字符串赋值给变量 hex_string。这个十六进制字符串表示ASCII字符的值,拼写出了 "Hello from server!"。
  2. decoded_string = bytes.fromhex(hex_string).decode("utf-8")

    • 这行代码的作用:
      • bytes.fromhex(hex_string) 将十六进制字符串转换为字节序列。
      • .decode("utf-8") 将字节解释为UTF-8编码的字符串。
      • 结果被存储在变量 decoded_string 中。
  1. hex_string = "48656c6c6f2066726f6d2073657276657221"
  2. decoded_string = bytes.fromhex(hex_string).decode("utf-8")
  3. print(decoded_string)

 

 

我上大一的时候还想抓包qq的连天记录,现在在知道怎么会这么容易让你知道聊天内容。就自己写了一个来抓包,顺便回忆一下计算机网络知识。 

 

 

 

 

  

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/84360
推荐阅读
相关标签
  

闽ICP备14008679号