一、TCP

TCP协议全称是传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP是面向连接的、可靠的流协议

特点

  • 面向连接
    • 面向连接,是指发送数据之前必须在两端建立连接。建立连接的方法是“三次握手”,这样能建立可靠的连接。建立连接,是为数据的可靠传输打下了基础。
  • 仅支持单播传输
    • 每条TCP传输连接只能有两个端点,只能进行点对点的数据传输,不支持多播和广播传输方式
  • 面向字节流
    • TCP不像UDP那样一个个报文独立地传输,而是在不保留边界的情况下按字节流传输
  • 可靠传输
    • 对于可靠传输,判断丢包、误码靠的是TCP的段编号和确认号。TCP为了保证报文传输的可靠,给每个包一个序号,同时序号也保证了接收端接收实体包的按序接收。然后接收端实体会在接收到报文后返回一个确认包(ACK),如果发送端实体未在合理的往返时延内收到确认,那么对应的数据就会被认为丢失,并重传。
  • 提供拥塞控制
    • 当网络出现拥塞的时候,TCP能减少向网络注入数据的速率和数量,缓解拥塞。
  • TCP提供双工通信
    • TCP允许通信双方的应用程序在任何时候都能发送数据,因为TCP连接的两端都没有缓存来临时存放双向通信的数据。当然,TCP可以立即发送一个数据段,也可以缓存一段时间以便一次发送更多的数据段(最大的数据段大小取决于MSS)。

      三次握手和四次挥手

      字段说明:
字段 含义
URG 紧急指针是否有效。为1,表示某一位需要被优先处理。
ACK 确认号是否有效,一般置为1。
PSH 提示接收端应用程序立即从TCP缓冲区把数据读走。
RST 对方要求重新建立连接,复位。
SYN 请求建立连接,并在其序列号的字段进行序列号的初始值设定。建立连接,设置为1。
FIN 希望断开连接。
seq 序列号,占4个字节,用来标记数据段的顺序。
ack 确认号,占4个字节,期待收到对方下一个报文段的第一个数据字节的序号。

三次握手

image.png

过程理解

第一次握手:建立连接时,客户端发送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状态,完成三次握手,连接成功。

四次挥手

image.png

过程理解

第一次挥手:客户端发出连接释放报文,并且停止发送数据。释放数据报文首部,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不止支持一对一的传输,同样支持一对多、多对多、多对一的方式
  • UDP是面向报文的
    • 发送方的UDP对应用程序交下来的报文,在添加首部后就交给IP层。UDP对应用层交下来的报文,既不合并也不拆分,而是保留这些报文的边界。所以应用程序必须选择合适大小的报文
  • 不可靠性
    • 通信不需要建立连接,想发就发,不可靠
    • 收到什么数据就传输什么数据,并且不会备份数据,发送数据也不会关心对方是否正确地收到了数据
    • UDP没有拥塞控制,无论网络好或坏都已恒定速率发送数据,这样的弊端是网络条件不好时会造成丢包,优点是实时性强
  • 头部开销小,传输数据报文时效率很高

    • UDP头部包含以下数据

      • 两个16位的端口号,分别为源端口(可选)和目标端口
      • 整个数据报文的长度
      • 整个数据报文的校验和(IPv4可选字段),该字段用于发现头部信息和数据中的错误

        1. 因此UDP的头部只有8字节,相对于TCP20字节要小很多<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电话、视频会议、直播等) 适用于要求可靠传输的应用,例如文件传输