一.TCP协议
1.简介
TCP:传输控制协议(Transmission Control Protocol)是面向连接,可靠的传输层协议,每一条 连接只能有两个端点(服务器、客户端),所以每一条 TCP
连接只能是点对点的,具有“流量控制”,“拥塞控制”,“可靠性传输”的特点。
2.报文段
每个TCP连接传输的数据都是一个一个的报文段,而每个报文段都有一个TCP首部
- 在传输层,
TCP
报文段包括:TCP首部 + TCP数据部分; - 在网络层,
TCP
报文段成为IP数据部分,加上IP首部组成IP数据报文; - 在数据链路层,还要在IP数据报前面加上数据链路层的首部;
报文段格式如下:
TCP首部内容:
TCP首部中前20个字节是固定内容
TCP首部的最小开销为20字节,最大开销为60字节
3.连接管理
TCP
提供面向连接的通信传输。面向连接是指在数据通信开始之前,先做好通信两端之间的准备工作。
TCP
会在数据通信之前,通过TCP
首部发送一个SYN
包作为建立连接的请求并等待确认应答。如果对方主机发来确认应答,则认为可以进行数据通信。如果对方主机的确认应答未能到达,则不会进行数据通信。此外,在通信结束时,会通过发送FIN
包进行断开连接的处理。
建立连接时(三次握手):
第一次握手:客户端先向服务器发送一个同步数据包(报文段)。数据包的TCP
首部内容:同步SYN=1,确认ACK=0,序号seq=x根据TCP
首部内容,表示这是一个请求建立连接的数据包,其中seq=x
为所传送数据的第一个字节的序号。
第二次握手:服务器收到客户端发送的第一个数据包后,根据SYN=1
与ACK=0
,判断出为主动建立连接的数据包。若服务器同意连接,则服务器发送一个数据包进行回应。数据包的TCP首部内容:同步SYN=1,确认ACK=1,序号seq=y,确认号ack=x+1确认ACK=1
,代表服务器同意连接;确认号ack=x+1
,表示已经收到客户端发送的x
个字节数据,并告诉客户端下次应从数据的第x+1
个字节开始发送;序号seq=y
的值由服务器指定,表示服务器发送数据时的第一个数据字节的序号;
第三次握手:客户端收到服务器的确认之后,再给服务器发送一个数据包。数据包的TCP首部内容:同步SYN=0,确认ACK=1,序号seq=x+1,确认号ack=y+1SYN=0
,表示双方已同意建立连接;确认号ack=y+1
,表示收到服务器发送y
字节数据,并告诉服务器下次应从数据的第y+1
个字节开始发送。序号seq=x+1
,表示发出的数据包就是数据的第x+1
个字节;确认ACK=1
,表示收到服务器的确认数据包;
断开连接时(四次挥手):
第一次挥手:首先客户端向服务器发送连接释放的请求报文(数据包),并停止发送数据。在连接释放报文(数据包)的TCP首部中:终止FIN=1,确认ACK = 0,终止FIN=1,意味着客户端要主动释放客户端—>服务器的TCP连接;序号位seq为u,u值由客户端指定。随后等待B的确认。
第二次挥手:服务器收到连接释放的报文之后,给客户端发送确认报文。从客户端到服务器这个方向上的连接就释放了,TCP连接处于半关闭状态。此时客户端无法发送数据给服务器,但是服务器还可以发送数据给客户端,客户端仍可以接收。在服务器发送给客户端确认报文的TCP首部中:终止FIN=0,确认ACK=1,序号位seq=v,确认号ack=u+1,确认ACK=1表示收到了客户端发送的数据包,同意客户端释放连接;
第三次挥手:若服务器已经没有向客户端发送的数据了,其应用进程就通知TCP释放连接,并向客户端发送确认报文。在确认报文的TCP首部中:确认ACK=1,终止FIN=1确认ACK=1,表示服务器已经把需要发给客户端的数据发完了;终止FIN=1,表示服务器要释放服务器—>客户端的TCP连接;此后服务器不再向客户端发送数据,但能接收数据。
第四次挥手:客户端收到服务器的连接释放报文段后,向服务器发出确认报文。在确认报文的TCP首部中:确认ACK=1,终止FIN = 0确认ACK=1,表示收到服务器的确认报文,并同意服务器释放连接;
4.流量控制
TCP协议基于滑动窗口这种机制来实现流量控制。发送方和接收方分别维护各自的缓冲区,这个缓冲区就是窗口。发送方的窗口大小由接收方的TCP
首部的窗口字段决定。
发送方将窗口内容分为:已发送并确认,已发送未确认,未发送未超出接收方窗口范围,未发送但超出接收方窗口范围。随着接收方的确认,发送方将不断在窗口内向前滑动。
接收方将窗口内容分为:接受已确认,未收到但可以接受。接收方读取窗口内容,并不断确认通知发送方,窗口向前滑动。接收方通过改变窗口大小,可以控制发送方的速率,从而实现流量控制。
原理:
发送窗口内的字节都允许被发送,接收窗口内的字节都允许被接收。如果发送窗口左部的字节已经发送并且收到了确认,那么就将发送窗口向前滑动一定距离,直到左部第一个字节不是已发送并且已确认的状态;接收窗口的滑动类似,接收窗口左部字节已经发送确认并交付主机,就向前滑动接收窗口。通过控制窗口的大小来实现流量控制
5.拥塞控制
拥塞控制时为了防止过多的数据注入到网络中,导致网络中的路由器或链路过载。
TCP协议只要通过四个算法来实现拥塞控制:慢开始、拥塞避免、快重传、快恢复
发送方需要维护一个叫做拥塞窗口(cwnd
)的状态变量,注意拥塞窗口与发送方窗口的区别:拥塞窗口只是一个状态变量,实际决定发送方能发送多少数据的是发送方窗口。
慢开始:发送最初执行慢开始,令 cwnd = 1
,发送方只能发送 1
个报文段;当收到确认后,将 cwnd
加倍,因此之后发送方能够发送的报文段数量为:2
、4
、8
...(指数级增长)
拥塞避免:设置一个慢开始门限 ssthresh
,当 cwnd >= ssthresh
时,进入拥塞避免,每个轮次只将 cwnd
加 1,降低拥塞窗口的增长速度。如果出现了超时,则令 ssthresh = cwnd / 2
,然后开始执行快恢复。(因为慢开始的增长速度很快,所以会设置门限值避免拥塞)
快重传:在接收方,要求每次接收到报文段都应该对最后一个已收到的有序报文段进行确认,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段。
快恢复:执行“乘法减小”算法,把慢开始门限 ssthresh
减半,cwnd也减半。然后执行拥塞避免,每次cwnd+1
二.UDP协议
1.简介
UDP
不提供复杂的控制机制,利用IP
提供面向无连接的通信服务。并且它是将应用程序发来的数据在收到的那一刻,立即按照原样发送到网络上的一种机制。
2.报文段
- 在传输层,
UDP
报文段包括:UDP首部 + UDP数据部分; - 在网络层,
UDP
报文段成为IP数据部分,加上IP首部组成IP数据报文; - 在数据链路层,还要在IP数据报前面加上数据链路层的首部;
报文段格式如下:
UDP首部内容:
其中12字节伪首部主要存放在应用层传递的ip
UDP首部固定长度为8个字节
三.区别
面向连接:TCP协议需要建立连接,仅支持一对一通信;UDP
协议无需建立连接,支持一对一、一对多、多对一和多对多的交互通信。
可靠传输:TCP
协议通过确认应答、连接管理、流量控制、拥塞控制来确保可靠性传输;UDP
不保证可靠性传输。
性能效率:TCP
协议传输效率慢,需要较多的资源开销。UDP
协议传输效率快,需要较少的资源开销。
首部格式:TCP
协议的首部需要20-60
个字节,UDP
协议需要8个字节。