文章目录
- 一、TCP和UDP的区别
- 二、TCP
- 1.TCP报文段
- 2.建立连接(三次握手)
- 3.断开连接(四次挥手)
- 4.TCP提供的支持
- 三、UDP
- 参考
一、TCP和UDP的区别
传输层协议有两个——TCP和UDP,二者区别如下:
二、TCP
1.TCP报文段
- 序号Seq: 当TCP从进程接受数据字节时,就把它们存储在发送缓存中,并对每一个字节进行编号,编号的特点是编号不一定从0开始,一般会产生一个随机数作为第一个字节的编号,称为初始序号(ISN),范围是0~2^32-1。TCP每个方向的编号都是互相独立的。当字节都被编上号后,TCP就给每个报文段指派一个序号,序号就是该报文段中的第一个字节的编号。当数据到达目的地后,接收端会按照这个序号把数据重新排列,确保数据的正确性。
- 确认号Ack: 确认号是对发送端的确认信息,用它来告诉发送端这个序号之前的数据段都已经收到。
- 控制位: 这六位有着很重要的作用,TCP的连接、传输和断开都受这六个控制位的指挥。
URG(紧急位):紧急指针有效位
ACK(确认位):只有当ACK=1时,确认序列号o字段才有效;当ACK=0时,确认序列号字段无效。
PSH(急迫位):标志位为1时要求接收方尽快将数据段送达应用层。
PST(重置位):当PST值为1时通知重新建立TCP连接。
SYN(同步(连接)位):同步序号位,TCP需要 建立连接时 将这个值设为1。
FIN(断开位):发送端完成发送任务位,当TCP完成数据传输 需要断开连接时 ,提出断开连接的一方这个值设为1。
2.建立连接(三次握手)
确认号Ack是为了确认收到了对方的数据以及确认收到了正确的序列号Seq而设置的。
- 第一次握手: PC1向PC2发送一个SYN报文,请求建立连接,其中包括了Seq = x和SYN = 1。
- 第二次握手: PC2收到PC1的报文后,回复一个SYN+ACK报文,表示收到对方的请求,并请求建立连接,其中包括了Seq = y、Ack = x+1,SYN = 1,ACK = 1。
- 第三次握手: PC1收到PC2的报文后,回复一个ACK报文,表示确认收到,其中包括了Seq = y、Ack = x+1,SYN = 1,ACK = 1。
- 建立连接: PC2收到第三次握手报文之后,两个机器建立起连接。
- 为什么是三次不是两次: 试想一下,假如两次握手就建立起了连接。如果1端此前有一个请求建立连接的报文在发给2端的途中丢失了,超时重传机制会让1端重新发送一个报文,从而继续建立连接。但是,过了可能一段时间后,此前1端丢失的报文到达了2端,如果是两次握手,那么此时1和2端就会直接建立起连接,然后2端认为他们已经建立起了连接,但是1端又没有通信需求,因此2端就会进入不必要的等待状态中,这其实是一种资源上的浪费。
3.断开连接(四次挥手)
- 第一次挥手: client向server发送一个FIN报文,请求断开连接,其中包括了Seq = p和FIN = 1。
- 第二次挥手: server收到client的报文后,回复一个ACK报文,表示收到对方的请求,其中包括了Ack = p+1,ACK = 1。
- 第三次挥手: 由于此时server端可能还有数据没发送完,因此会继续发送数据,然后等发送完后,会向client发送一个FIN报文,请求断开连接,其中包括了Seq = q和FIN = 1。
- 第四次挥手: client收到报文后,回复一个ACK报文,表示收到对方的请求,其中包括了Ack = q+1,ACK = 1。然后client会进入超时等待状态,过了这个状态后二者断开连接。
-
为什么是四次: 多了第三次挥手,目的是为了确保server端数据能发送完,而不是在数据没发完的时候就断开连接。
-
为什么超时等待: 设定一个时间,如果在时间内server端没有因为没收到来自client端的报文而重新发起第三次挥手,则表明对方收到了client发过去的第四次挥手,就可以真正断开了,避免server陷入没必要的等待中。
4.TCP提供的支持
- 可靠性支持:
序列号:给每个字节提供序列编号。
确认应答:对于对方发送过来的数据进行带确认序号的确认应答。
超时重传:一定时间内没有收到确认,会进行超时重传。
-
效率支持(滑动窗口):
滑动窗口:通过滑动窗口机制提升通信效率,可以进行多个数据段的发送和确认应答等待。 -
流量控制(滑动窗口):
如果发送端一味地发送数据,当发送的数据量超出了接收方的接收能力时,就会导致数据因为来不及接收而丢失,因此需要进行流量控制。具体操作是,接收端向发送端通知自己可以接收数据的大小(窗口),发送方将会根据窗口大小控制数据的发送量。 -
拥塞控制(滑动窗口):
网络是有一定承受能力的,在网络拥堵时,如果如果突然发送一个较大的数据,就可能导致网络的瘫痪。因此TCP提供了一种慢启动算法,对发送的数据量进行控制。
在一开始,将拥塞窗口的大小设置为1个数据段(MSS最大数据分段),随着每一次发送数据并收到确认应答之后,窗口大小+1;
在每次发送数据时,会比较拥塞窗口大小和流量控制窗口大小,选一个更小值作为发送数据的窗口大小;
设置一个慢启动阈值,当拥塞窗口大于这个值时,将通过以下公式计算窗口放大比例:1个数据段的字节数^2/拥塞窗口大小的字节数。
三、UDP
- UDP报文段:
- UDP是面向无连接的,它可以随时发送数据,并且不会提供任何可靠机制,适用于以下场景:
包总量较少的通信,比如DNS。
视频、音频等多媒体即时通信,略微丢帧也没关系。
广播、多播通信。
参考
《图解TCP/IP》
blog