关于TCP和UDP的总结

本文详细介绍了TCP和UDP两种传输层协议的工作原理、特性以及应用场景。TCP提供可靠的数据传输,通过三次握手建立连接,确保数据的有序、无丢失。而UDP则是面向无连接的协议,传输速度快但不保证数据的顺序和完整性。了解两者之间的区别对于网络编程至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TCP、 UDP、端口号、协议号
TCP:传输控制协议,可靠度面向用户的连接。
UDP:用户数据报协议,不可靠的无连接服务。
UDP用于视频传输,一般长度为500个字节。
端口号:为了标识上层(应用层)协议。
协议号:用于标识上层(传输层)协议。
MTU:最大传输单元,针对网络层数据的大小。
MSS:最大报文段长度,针对TCP能承载的数据大小。
2. TCP数据包结构
源端口(sport):指一个发送端口,系统随机分配。
目标端口(dport):指数据接收者端口,一般是确定的。
序列号:为了标识数据包。
确认序号:确认数据包的到达。
报头长度:占用4bit,最大60B,最小20B。报头长度就是TCP报文长度。
保留:占6bit
标志位:六个标志位,每个作用如表1:
标志位
作用
URG
连接紧急位
ACK
在三次握手和四次挥手用(跟确认序列号挂钩)
PSH
推送数据时用
RAT
重置链接
SYN
三次握手用
FIN
拆连接用
表1
窗口:用来控制对方发送的数据量,单位字节。窗口大小指的是TCP缓存大小,最大65536B。
检验和:检查数据包
紧急位:用来标记某些紧急数据,可提前处理。
可选项:报头长度大于20B时选择可选项。
3. UDP数据包结构
源端口:指一个发送端口,系统随机分配。
目标端口:指数据接收者端口,一般是确定的。
长度:就是指数据长度+UDP长度。
检验和:检查数据包。
4. IP数据包结构
版本号:4,占4bit。
头部长度:占4bit,IP协议本身头部长度。
服务类型:用于流控,占8bit,QoS服务质量。
数据包长度:数据包数据长度+报头长度。
标识号:用来标识一个数据包。
标志位:占3bit,第一个保留,第二个允许分片位d(don’t),当d=0时,允许分片,当d=1时,不允许分片。第三个更多分片位m(more),当m=0时,是代表最后一片,当m=1时,表示更多分片位。
偏移位:分开的数据重组的时候需要用偏移位。
生存时间(TTL):数据包每经过一个路由器TTL的指就会减1,如果TTL的值为0,路由器则丢包,不负责传送。
协议号:用来标识上层协议(TCP=6  UDP=17  ICMP=1  IGMP=2)。
头部检验和:就是用来检测头部数据是否完整。
源IP地址:发送者地址。
目标IP地址:接受者地址。
可选项
填充

 

### Java 中 TCP UDP 的面试常见问题及解答 #### 一、TCP UDP 的基本概念 TCP(Transmission Control Protocol) UDP(User Datagram Protocol)是两种常见的传输层协议。TCP 是面向连接的可靠协议,而 UDP 则是非面向连接的不可靠协议[^3]。 - **TCP 特点** 提供可靠的字节流服务,通过三次握手建立连接,四次挥手断开连接。适用于需要高可靠性场景下的数据传输[^4]。 - **UDP 特点** 不提供确认机制,速度快但可能会丢失数据包或乱序到达。适合实时性强的应用场景,如音视频通话。 --- #### 二、TCP UDP 的主要区别 | 对比项 | TCP | UDP | |----------------|------------------------------------|----------------------------------| | 连接方式 | 面向连接 | 非面向连接 | | 可靠性 | 高度可靠 | 不可靠 | | 数据单位 | 字节流 | 数据报 | | 应用场景 | 文件下载、邮件收发 | 实时语音聊天、在线游戏 | | 开销 | 较大 | 较小 | 上述表格展示了两者的主要差异。 --- #### 三、TCP 的三次握手与四次挥手过程 ##### 1. 三次握手 - 客户端发送 SYN 请求至服务器; - 服务器收到后返回 ACK 并带上自己的 SYN; - 客户端再次发送 ACK 给服务器完成握手。 ```python # Python 示例:创建一个简单的 TCP Server import socket server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind(('localhost', 8080)) server_socket.listen(5) print("Server is listening...") client_socket, addr = server_socket.accept() data = client_socket.recv(1024).decode('utf-8') print(f"Received data: {data}") client_socket.close() ``` ##### 2. 四次挥手 - 主动方发送 FIN 表示不再发送数据; - 被动方回复 ACK 确认; - 被动方随后也发送 FIN; - 主动方最终回复 ACK 结束连接。 --- #### 四、UDP 的应用场景及其特点 由于 UDP 缺乏重传机制,在某些特定场合下却能发挥重要作用。例如直播平台为了追求流畅体验允许少量丢帧现象存在;DNS 查询通常采用该种方式进行快速响应。 --- #### 五、Socket 编程基础 无论是基于哪种协议实现通信功能都需要借助 Socket API 来完成实际操作流程描述如下: 1. 创建套接字对象实例化相应类; 2. 如果是服务端还需要绑定地址信息以及进入监听状态等待接入请求到来; 3. 接受来自远端主机发起的新链接或者直接发送消息过去; 4. 执行具体业务逻辑处理完毕之后记得释放资源关闭所有打开过的文件句柄等等。 ```java // Java 示例:简单 UDP Client 发送消息 import java.net.DatagramPacket; import java.net.DatagramSocket; public class UDPSender { public static void main(String[] args) throws Exception { String message = "Hello from UDP!"; byte[] sendData = message.getBytes(); DatagramSocket udpSocket = new DatagramSocket(); DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, InetAddress.getByName("localhost"), 9876); udpSocket.send(sendPacket); udpSocket.close(); } } ``` --- ### 总结 通过对以上内容的学习可以发现掌握好这两者之间本质上的不同之处有助于我们更好地理解计算机网络工作原理从而提高解决实际工程难题的能力水平。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值