一、传输控制协议(TCP)
传输控制协议(Transmission Control Protocol,TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由 IETF 的 RFC 793 定义。
它通过三次握手建立连接,确保数据的可靠传输,并提供顺序控制、流量控制和拥塞控制等功能。
在简化的计算机网络 OSI 模型中,它完成第四层传输层所指定的功能。用户数据报协议(UDP)是同一层内另一个重要的传输协议。
在因特网协议族(Internet protocol suite)中,TCP 层是位于 IP 层之上,应用层之下的中间层。
1.TCP的特点
- TCP 是面向连接(虚连接)的传输层协议。
- 每一条 TCP 连接只能有两个端点,每一条 TCP 连接只能是点对点的。
- TCP 提供可靠交付的服务,无差错、不丢失、不重复、按序到达。
- TCP 提供全双工通信。
- TCP 面向字节流
2.TCP报文
- 源端口(Source Port):16 bits,通过一个端口号告诉 TCP 报文来自于哪个进程。
- 目标端口(Destination Port):16 bits,通过一个端口号告诉 TCP 报文要发给哪个进程。
- 序号(Sequence Number,seq):32 bits,在一个 TCP 连接中传送的字节流中的每一个字节都按顺序编号,本字段表示本报文段所发送数据的第一个字节的序号 。
- 确认号(Acknowledgment Number,ack):32 bits, 期望收到对方下一个报文段的第一个数据字节的序号。若确认号为N,则证明到序号N-1为止的所有数据都已正确收到。
- 数据偏移(Data Offset,DOffset) :4 bits,TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远,以4B位单位,即1个数值是4B。
- 保留(Reserved ,Rsrvd):6 bits,须置0。
- 控制位(Flags):6 bits,
- 紧急位 URG:URG=1 时,标明此报文段中有紧急数据,是高优先级的数据,应尽快传送,不用在缓存里排队,配合紧急指针字段使用。
- 复位 RST:RST=1 时,表明 TCP 连接中出现严重差错,必须释放连接,然后再重新建立传输链接。
- 确认位 ACK:ACK=1 时确认号有效,在连接建立后所有传送的报文段都必须把 ACK 置为 1。
- 推送位 PSH:PSH=1 时,接收方尽快交付接收应用进程,不再等到缓存填满再向上交付。
- 同步位 SYN:SYN=1 时,表明是一个连接请求/连接接受报文。
- 终止位 FIN:FIN=1 时,表明此报文段发送方数据已发完,要求释放连接。
- 窗口(Window,WIN):16 bits,指的是发送本报文段的一方的接收窗口,即现在允许对方发送的数据量。
- 检验和(Checksum):16 bits,检验首部+数据,检验时要加上 12B 伪首部,第四个字段为6。
- 紧急指针(Options) :16 bits,URG=1 时才有意义,指出本报文段中紧急数据的字节数。
- 选项(Options ) :最多40 bits,最大报文段长度MSS、窗口扩大、时间戳、选择确认…
3.TCP连接过程
TCP 是面向连接的,客户端与服务器要建立连接才能进行通信,通信后需要断开连接。
(1)三次握手建立连接
假设运行在一台主机(客户)上的一个进程想与另一台主机(服务器)上的一个进程建立一条连接,客户应用进程首先通知客户 TCP,他想建立一个与服务器上某个进程之间的连接,客户中的 TCP 会用以下步骤与服务器中的 TCP 建立一条 TCP 连接:
- 第一次握手:客户端把 SYN 标志位置为1,随机初始化 “序列号” seq=x 的数据包到服务器,并进入 SYN-SENT 状态;服务器由 SYN=1 知道,客户端要求建立联机,此时服务器进入 LISTEN 状态;
- 第二次握手:服务器收到请求后,随机初始化自己的“序列号” seq=y,“确认应答号” ack=x+1,把 SYN 和 ACK 标志位置为1,把该报文发给客户端,此时服务器进入进入 SYN-RECEIVED 状态。
- 第三次握手:客户端收到服务端报文后,将 ACK 标志位置为1,“确认应答号” ack=y+1,“序列号” seq=x+1,最后把报文发送给服务端,这次报文可以携带客户到服务端的数据,之后客户端和服务器处于 ESTABLISHED 状态。
(2)四次挥手关闭连接
参与一条TCP连接的两个进程中的任何一个都能终止该连接,连接结束后,主机中的“资源”(缓存和变量)将被释放。
- 第一次挥手:客户端发送一个 FIN=1,seq=u 的数据包到服务端,用来关闭客户端到服务器的数据传送。然后客户端进入 FIN-WAIT-1 状态。
- 第二次挥手:服务器收到这个数据包,它发送一个 ACK标志为1,ack=u+1,seq=v 的数据包到客户端 。然后服务端进入 CLOSE-WAIT 状态,客户端进入 FIN-WAIT-2 状态。
- 第三次挥手:服务端发送一个 FIN=1,ACK=1,seq=w,ack=u+1 的数据包到客户端,请求关闭连接,然后服务端进入 LAST-ACK 状态。
- 第四次挥手:客户端发送 ACK=1,ack=w+1 的数据包到服务端,然后客户端进入TIME-WAIT 状态,服务端在收到数据包后进入 CLOSE 状态。
此时如果客户端等待 2MSL 后依然没有收到回复,就证明服务端已正常关闭,随后客户端也可以关闭连接了。
二、TCP 保证可靠性机制
可靠:保证接收方进程从缓存区读出的字节流与发送方发出的字节流是完全一样的。
前文提到 TCP 是可靠的,那么 TCP 靠着哪些机制保证了可靠性呢?
TCP 主要通过重传机制、滑动窗口、 流量控制、拥塞控制四个机制来保证可靠性的。
1. 重传机制
在错综复杂的网络,数据在传输过程中是有可能丢失的,所以 TCP 针对数据包丢失的情况,会用重传机制解决。
超时重传
发送方在发送数据时,设定一个定时器,使用一个保守估计的时间作为收到 ACK 确认应答报文的超时上限。如果超过这个上限仍未收到对方的 ACK 确认应答报文,发送方将重传这个数据包。每当发送方收到确认包后,会重置这个重传定时器。
TCP 会在以下两种情况发生超时重传:数据包丢失、确认应答丢失。
2. 滑动窗口
3. 流量控制
4. 拥塞控制
三、用户数据报协议(UDP)
用户数据报协议(User Datagram Protocol,UDP)又称用户数据包协议,是一个简单的是一种无连接的、不保证可靠的、面向数据包的传输层通信协议,位于OSI模型的传输层。
该协议由 David P. Reed 在1980年设计且在RFC 768中被规范。典型网络上的众多使用 UDP 协议的关键应用在一定程度上是相似的。
在 TCP/IP 模型中,UDP 为网络层以上和应用层以下提供了一个简单的接口。UDP 只提供数据的不可靠传递,它一旦把应用程序发给网络层的数据发送出去,就不保留数据备份(所以 UDP 有时候也被认为是不可靠的数据包协议)。UDP 在 IP 数据包的头部仅仅加入了复用和数据校验字段。
1.UDP 的特点
- UDP是无连接的,减少开销和发送数据之前的时延。
- UDP使用最大努力交付,即不保证可靠交付 。
- UDP是面向报文的,适合一次性传输少量数据的网络应用。
- UDP无拥塞控制,适合很多实时应用。
- UDP首部开销小,8B,TCP20B。
2.UDP 报文
- 源端口(Source Port):16 bits,通过一个端口号告诉 TCP报文来自于哪个进程。
- 目标端口(Destination Port):16 bits,通过一个端口号告诉 TCP报文要发给哪个进程。
- 包长度(Length):16 bits,该字段保存了 UDP 首部的长度跟数据的长度之和。
- 校验和(Checksum):16 bits,校验和是为了提供可靠的 UDP 首部和数据而设计,防止收到在网络传输中受损的 UDP 包。
四、TCP 与 UDP 区别
1.TCP 与 UDP 区别
- 面向连接:TCP 是面向连接的传输层协议,传输数据前先要建立连接。UDP 是不需要连接,即刻传输数据;
- 服务对象:TCP 是一对一的两点服务,即一条连接只有两个端点。UDP 支持一对一、一对多、多对多的交互通信;
- 可靠传输:TCP 是可靠交付数据的,数据可以无差错、不丢失、不重复、按序到达。UDP 是尽最大努力交付,不保证可靠交付数据,但是我们可以基于 UDP 传输协议实现一个可靠的传输协议,QUIC 协议;
- 拥塞控制、流量控制:TCP 有拥塞控制和流量控制机制,保证数据传输的安全性。UDP 则没有,即使网络非常拥堵了,也不会影响 UDP 的发送速率;
- 传输效率:由于使用 TCP 进行传输的时候多了连接、确认、重传等机制,所以 TCP 的传输效率要比 UDP 低很多;
- 首部开销:TCP首部开销20字节。UDP首部开销8字节;
- 传输方式:TCP 是流式传输,没有边界,但保证顺序和可靠。UDP 是一个包一个包的发送,是有边界的,但可能会丢包和乱序。
2.TCP 与 UDP 应用场景
- 由于 TCP 是面向连接,能保证数据的可靠性交付,因此经常用于: FTP 文件传输; HTTP / HTTPS;
- 由于 UDP 面向无连接,它可以随时发送数据,再加上 UDP 本身的处理既简单又高效,因此经常用于: 包总量较少的通信,如 DNS 、SNMP 等; 视频、音频等多媒体通信; 广播通信;