一、TCP
TCP协议全称是传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP是面向连接的、可靠的流协议
特点
- 面向连接
- 面向连接,是指发送数据之前必须在两端建立连接。建立连接的方法是“三次握手”,这样能建立可靠的连接。建立连接,是为数据的可靠传输打下了基础。
- 仅支持单播传输
- 每条TCP传输连接只能有两个端点,只能进行点对点的数据传输,不支持多播和广播传输方式
- 面向字节流
- TCP不像UDP那样一个个报文独立地传输,而是在不保留边界的情况下按字节流传输
- 可靠传输
- 对于可靠传输,判断丢包、误码靠的是TCP的段编号和确认号。TCP为了保证报文传输的可靠,给每个包一个序号,同时序号也保证了接收端接收实体包的按序接收。然后接收端实体会在接收到报文后返回一个确认包(ACK),如果发送端实体未在合理的往返时延内收到确认,那么对应的数据就会被认为丢失,并重传。
- 提供拥塞控制
- 当网络出现拥塞的时候,TCP能减少向网络注入数据的速率和数量,缓解拥塞。
- TCP提供双工通信
字段 | 含义 |
---|---|
URG | 紧急指针是否有效。为1,表示某一位需要被优先处理。 |
ACK | 确认号是否有效,一般置为1。 |
PSH | 提示接收端应用程序立即从TCP缓冲区把数据读走。 |
RST | 对方要求重新建立连接,复位。 |
SYN | 请求建立连接,并在其序列号的字段进行序列号的初始值设定。建立连接,设置为1。 |
FIN | 希望断开连接。 |
seq | 序列号,占4个字节,用来标记数据段的顺序。 |
ack | 确认号,占4个字节,期待收到对方下一个报文段的第一个数据字节的序号。 |
三次握手
过程理解
第一次握手:建立连接时,客户端发送syn包(seq=x)至服务器,并进入SYN-SENT状态,等待服务器确认。
第二次握手:服务器收到syn包,确认客户端的SYN(ack=x+1),同时自己也发送一个SYN+ACK包(seq=y),服务器进入SYN-RCVD状态。
第三次握手:客户端接收到服务器的SYN+ACK包,向服务器发送确认包ACK包(seq=x+1, ack=y+1),发送完毕后客户端和服务器进入ESTAB-LISHED状态,完成三次握手,连接成功。
四次挥手
过程理解
第一次挥手:客户端发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号seq=u(之前传输的数据的最后一个字节的序号+1),客户端进入ESTAB-LISHED状态。
第二次挥手:服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上了自己的序列号seq=v,此时,服务端进入CLOSE-WAIT状态,客户端进入FIN-WAIT-2状态。此时客户端已经没有数据要发送了,但是依然要接收服务端发送的数据,这个状态需要持续一段时间,也就是CLOSE-WAIT的时间。
第三次挥手:服务端将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于服务端可能之前又发送了一些数据,所以现在的序列号seq=w。此时,服务端进入了LAST-ACK(最后确认)阶段,等待客户端的确认
第四次挥手:客户端接收到服务端的连接释放报文后,发出确认,ACK=1,ack=w+1,序列号seq=u+1,此时,服务端立即进入CLOSED状态,而客户端进入TIME-WAIT状态,此时TCP的连接还没有释放,必须经过2MSL(MSL为最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
二、UDP
UDP协议全称是用户数据报协议,是一种无连接的协议。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,即当报文发送后,是无法得知其是否安全到达的。
特点
- 面向无连接
- UDP不需要和TCP一样在发送数据前进行三次握手,想发数据就发送了,并且不会对数据报文进行拆分和拼接的操作。
- 在发送端,应用层将数据传给传输层的UDP协议,UDP协议只是在数据上加一个UDP头标识一下是UDP协议,就将数据传递给网络层
- 在接收端,网络层将数据传输给传输层,UDP只去除IP报文头就将数据传给应用层了,不会进行拼接操作。
- UDP不需要和TCP一样在发送数据前进行三次握手,想发数据就发送了,并且不会对数据报文进行拆分和拼接的操作。
- 有单播、多播、广播的功能
- UDP不止支持一对一的传输,同样支持一对多、多对多、多对一的方式
- UDP是面向报文的
- 发送方的UDP对应用程序交下来的报文,在添加首部后就交给IP层。UDP对应用层交下来的报文,既不合并也不拆分,而是保留这些报文的边界。所以应用程序必须选择合适大小的报文
- 不可靠性
- 通信不需要建立连接,想发就发,不可靠
- 收到什么数据就传输什么数据,并且不会备份数据,发送数据也不会关心对方是否正确地收到了数据
- UDP没有拥塞控制,无论网络好或坏都已恒定速率发送数据,这样的弊端是网络条件不好时会造成丢包,优点是实时性强
头部开销小,传输数据报文时效率很高
UDP头部包含以下数据
- 两个16位的端口号,分别为源端口(可选)和目标端口
- 整个数据报文的长度
整个数据报文的校验和(IPv4可选字段),该字段用于发现头部信息和数据中的错误
因此UDP的头部只有8字节,相对于TCP的20字节要小很多<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/589861/1646385311132-c84aa9d7-8930-436f-aa8c-144097585d4f.png#clientId=u16af3313-c4dd-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=uda072d54&margin=%5Bobject%20Object%5D&name=image.png&originHeight=282&originWidth=574&originalType=url&ratio=1&rotation=0&showTitle=true&size=81733&status=done&style=none&taskId=u8ad199eb-0089-4eac-b3ba-c70ec6058b0&title=UDP%E6%8A%A5%E6%96%87%E6%A0%BC%E5%BC%8F "UDP报文格式")<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/589861/1646385311123-24c1b12b-3f2a-4b67-a1c2-ff9e4f04f302.png#clientId=u16af3313-c4dd-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=ua3e49345&margin=%5Bobject%20Object%5D&name=image.png&originHeight=397&originWidth=595&originalType=url&ratio=1&rotation=0&showTitle=true&size=38527&status=done&style=none&taskId=u616ee841-5340-4365-90d6-a9400543894&title=TCP%E6%8A%A5%E6%96%87%E6%A0%BC%E5%BC%8F "TCP报文格式")<br />**三、TCP和UDP的区别**
|
UDP | TCP | |
---|---|---|
是否连接 | 无连接 | 面向连接 |
是否可靠 | 不可靠,不使用流量控制和拥塞控制 | 可靠传输,使用流量控制和拥塞控制 |
连接对象个数 | 支持一对一、一对多、多对多和多对一交互通信 | 只能是一对一通信 |
传输方式 | 面向报文 | 面向字节流 |
首部开销 | 首部开销小,仅8字节 | 首部最小20字节,最大60字节 |
使用场景 | 适用于实时应用(IP电话、视频会议、直播等) | 适用于要求可靠传输的应用,例如文件传输 |