TCP段结构,流量&拥塞控制,三次握手四次挥手,有限状态机

文章目录

    • 一、TCP&UDP概述
      • 1. TCP
      • 2. UDP
        • TCP VS UDP
    • 二、TCP&UDP段结构
      • 1. TCP段结构
      • 2. UDP段结构
        • UDP校验和(checksum)
    • 三、TCP流量控制
    • 四、TCP拥塞控制
      • AIMD
      • SS
    • 五、TCP三次握手和四次挥手
      • 1. TCP三次握手
      • 2. TCP四次挥手
    • 六、TCP的有限状态机

一、TCP&UDP概述

1. TCP

传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的可靠的基于字节流的传输层通信协议,由IETF的RFC 793定义。

特点:

  • 点对点:一个发送发,一个接收方
  • 可靠地、按序的字节流
  • 流水线机制:TCP拥塞控制和流量控制机制设置窗口尺寸
  • 发送方和接收方都存在缓存
  • 全双工:同一连接中能传输双向数据流
  • 面向连接:通信双方在发送数据之前必须建立连接。连接状态只在连接的两端维护,在沿途节点不维护状态。
  • 流量控制机制

2. UDP

用户数据报协议(UDP,User Datagram Protocol)为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。RFC 768描述了 UDP。

特点:

  • 无连接不可靠数据报传输
  • 有简单的错误校验
  • 属于"Best Effort"服务,UDP段可能丢失或乱序到达

优点:

  • 无需建立连接,减少延迟
  • 实现简单,无需维护连接状态
  • 头部开销少
  • 没有拥塞控制,应用可更好地控制发送时间和速率

应用:DNS,流媒体

TCP VS UDP

UDP和TCP协议的主要区别是两者在如何实现信息的可靠传递方面不同。TCP协议中包含了专门的传递保证机制,当数据接收方收到发送方传来的信息时,会自动向发送方发出确认消息;发送方只有在接收到该确认消息之后才继续传送其它信息,否则将一直等待直到收到确认信息为止。
与TCP不同,UDP协议并不提供数据传送的保证机制。如果在从发送方到接收方的传递过程中出现数据包的丢失,协议本身并不能做出任何检测或提示。因此,通常人们把UDP协议称为不可靠的传输协议。
TCP 是面向连接的传输控制协议,而UDP 提供了无连接的数据报服务;
TCP 具有高可靠性,确保传输数据的正确性,不出现丢失或乱序;UDP 在传输数据前不建立连接,不对数据报进行检查与修改,无须等待对方的应答,所以会出现分组丢失、重复、乱序,应用程序需要负责传输可靠性方面的所有工作;
UDP 具有较好的实时性,工作效率较 TCP 协议高;UDP 段结构比 TCP 的段结构简单,因此网络开销也小。
TCP 协议可以保证接收端毫无差错地接收到发送端发出的字节流,为应用程序提供可靠的通信服务。对可靠性要求高的通信系统往往使用 TCP 传输数据。

二、TCP&UDP段结构

1. TCP段结构

TCP段结构,流量&拥塞控制,三次握手四次挥手,有限状态机_第1张图片

  • Source Port:源端口,16位。
  • Destination Port:目的端口,16位。
  • Sequence Number:本报文段所发送数据段中的第一个字节的序列号,32位。(建立TCP连接时,双方随即选择序列号)
  • Acknowledgment Number:确认序列号,32位。是希望接收到的下一个报文段的第一个字节的序列号。
  • Data Offset:数据偏移,4位,该字段的值是TCP首部(包括选项)长度除以4。
  • 紧急URG:当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据),而不是按原来的排队顺序来传送。
  • 确认ACK:仅当ACK=1时,Acknowledgment Number字段才有效。当ACK=0时,Acknowledgment Number字段无效。TCP规定,在连接建立后,所有传送的报文段都必须把ACK置1。
  • 推送PSH:当两个应用进行交互式的通信时,有时一段的应用进程希望在键入一个命令后立即就能够收到对方的响应。此时,发送方TCP把PSH置1,并立即创建一个报文段发送出去,接收方收到后,就尽快交付接收应用进程,而不再等整个缓存填满了再向上交付。
  • 复位RST:当RST=1时,表明TCP连接中出现严重差错(由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。RST置1还用来拒绝一个非法的报文段或拒绝打开一个连接。
  • 同步SYN:在建立TCP连接时用来同步序号。
  • 终止FIN:表示没有数据需要发送了(在关闭TCP连接的时候使用)
  • Window:表示接收缓冲区的空闲空间,16位,用来告诉TCP连接对端自己能够接收的最大数据长度。
  • Checksum:校验和,16位。检验范围包括首部和数据两部分。
  • Urgent Pointers:紧急指针,16位,只有URG标志位为1时该字段才有意义,表示紧急数据相对序列号(Sequence Number字段的值)的偏移。

2. UDP段结构

TCP段结构,流量&拥塞控制,三次握手四次挥手,有限状态机_第2张图片

UDP校验和(checksum)

目的:检测UDP段在传输中是否发生错误(如位翻转)

发送方:将段的内容视为16 bit整数,计算所有整数的和,进位加在和的后面,将得到的值按位求反,得到校验和。将校验和放入校验和字段、
接收方:计算所收到段的校验和,将其与校验和字段进行对比。不相等则出错,相等则可能出错也可能无错。

三、TCP流量控制

接收方为TCP连接分配buffer,上层应用对buffer中数据处理速度可能较慢,而发送方传输过多过快,则导致接收方buffer溢出。
TCP段结构,流量&拥塞控制,三次握手四次挥手,有限状态机_第3张图片
假定TCP receiver丢弃乱序的segments
Buffer中可用空间(spare room) = RcvWindow = RcvBuffer - (LastByteRcvd - LastByteRead)
Receiver通过Segment头部字段将RcvWindow告诉Sender
Sender限制自己已经发送的但未接收到的ACK的数据不超过接收方的空闲RcvWindow尺寸
Receiver告知Sender RcvWindow=0时,发送发仍发送很小的段探测最新窗口大小

四、TCP拥塞控制

细节解释参看其他博文https://blog.csdn.net/qq_41431406/article/details/97926927

总结:
CongWin(拥塞窗口):动态调整以改变发送速率;反映所感知到的网络拥塞。
拥塞控制需要Sender限制发送速率:LastByteSent-LastByteAcked<=CongWin
感知网络拥塞的两种方式:(1)timeout (2)3个重复ACK
调整发送速率的两种方式:(1)加性增-乘性减:AIMD(2)慢启动:SS

AIMD

原理:逐渐增加发送速率,谨慎探测可用带宽,直到发生Loss
方法:
Additive Increase:每个RTT将CongWin增大1个MSS(Maximum Segment Size) ——避免拥塞;
Multiplicative Decrease:发生loss后将CongWin减半。

While(Sending_Not_Finish)
{
	if(Not_Loss_Packet)
	{
		CongWin++;
	}
	else
		CongWin=[CongWin/2]; //[]的意思是取整
}

TCP段结构,流量&拥塞控制,三次握手四次挥手,有限状态机_第4张图片

SS

方法:TCP建立连接时,CongWin=1,指数性增长,即每个RTT将CongWin翻倍,当CongWin达到loss时间前值的1/2时,切换为线性增长(拥塞避免)。
这种方法初始速率很慢,但快速攀升
TCP段结构,流量&拥塞控制,三次握手四次挥手,有限状态机_第5张图片
变量Threshold:loss事件发生时,Threshold被设为loss事件前CongWin值的1/2

TCP慢启动(SS)时loss事件的处理:

  1. Sender收到3个重复ACKs:CongWin切到一半,然后线性增长
  2. Timeout事件:CongWin直接设为1个MSS,然后指数增长,到达threshold后,再线性增长

Loss事件处理逻辑:3个重复ACKs表示网络还能传输一些segments,而timeout则表明拥塞更为严重,故采用上述处理方式。
TCP段结构,流量&拥塞控制,三次握手四次挥手,有限状态机_第6张图片
TCP快速重传为什么是三次重复ACKhttps://blog.csdn.net/weixin_36465540/article/details/105008315

五、TCP三次握手和四次挥手

1. TCP三次握手

TCP段结构,流量&拥塞控制,三次握手四次挥手,有限状态机_第7张图片
TCP连接中主动发起连接建立的应用进程叫做客户,被动等待连接建立的应用进程叫服务器

  1. B的TCP服务器先创建传输控制块TCB,准备接受客户进程的连接请求。然后服务器进程就处于LISTEN(收听)状态,等待客户的连接请求。
  2. A的TCP客户进程也是首先创建传输控制块TCB,然后向B发送连接请求报文段。此时首部中的同步位SYN=1,同时选择一个初始序号seq=x。这时TCP客户进程进入SYN-SENT(同步已发送)状态。
  3. B收到连接请求报文段后,如同意建立连接,则向A发送确认。确认报文段中SYN=1ACK=1,确认号ack=x+1,同时为自己选择一个初始序号seq=y。此时,TCP服务器进程进入SYN-RCVD(同步收到)状态。
    注:2,3步骤中,SYN=1报文段都不能携带信息,但都要消耗掉一个序号
  4. A收到B的确认后,还要向B给出确认。发送ACK=1,确认号ack=y+1,自己的序号seq=x+1。此时A进入ESTABLISHED(已建立连接)状态。
    注:ACK=1报文段可以携带数据,但如果不携带数据则不消耗序号,所以建立连接后,下一个报文段进行数据传送时,seq仍然为x+1。
  5. B收到A确认后也进入ESTABLISHED(已建立连接)状态。

这篇文章写得特别好,包括抓包示例,以及为什么使用三次握手,非常值得一看,这里不重复书写https://www.cnblogs.com/yweihum/p/9413480.html

2. TCP四次挥手

TCP段结构,流量&拥塞控制,三次握手四次挥手,有限状态机_第8张图片
数据传输结束后,通信双方都可以释放连接。

  1. A发送FIN=1seq=u,u为前面的已传送过的数据的最后一个字节的序号加1。此时A进入FIN-WAIT-1(终止等待1)状态,等待B确认。
  2. B发送确认ACK=1,确认号ack=u+1seq=v。B进入CLOSE-WAIT(等待关闭)状态。
    此时A到B方向连接被释放,TCP连接处于半关闭状态。即A已经没有数据发送了,但B若发送数据,A仍要接收。
  3. A收到来自B的确认,进入FIN-WAIT-2(终止等待2)状态,等待B发出连接释放报文段。
  4. 若B已经没有数据要向A发送,则发送连接释放报文段FIN=1seq=w(在半关闭状态B可能又发送了一些数据),ack=u+1。此时B进入LAST-ACK(最后确认)状态,等待A确认。
  5. A收到B的连接释放报文段,发送确认报文段ACK=1ack=w+1seq=u+1(FIN报文段消耗一个序号)。A进入TIME-WAIT(时间等待)状态。
  6. 经过时间等待计时器(TIME-WAIT timer)设置的2MSL(Maximum Segment Lifetime)后,A进入CLOSED状态。

Q:为什么A在TIME-WAIT状态必须等待2MSL的时间?
A:根据谢希仁《计算机网络第六版》,有以下两个理由。

  1. 为了保证A发送的最后一个ACK报文段能到达B。这个ACK报文段可能丢失,因而使处在LAST-ACK状态的B收不到对已发送的FIN+ACK报文段的确认。B会超时重传这个FIN+ACK报文段,而A就能在2MSL时间内收到这个重传的FIN+ACK报文段。接着A重传一次确认,重启2MSL计时器。最后,A和B都正常进入CLOSED状态。如果A再TIME-WAIT状态不等待一段时间,而是在发送完ACK报文段后立即释放连接,那么久无法收到B重传的FIN+ACK报文段,因而也不会再发送一次确认报文段。这样,B就无法按照正常步骤进入CLOSED状态。
  2. 防止三次握手时提到的“已失效的连接请求报文段”出现在本连接中。A在发送完最后一个ACK报文段后,再经过时间2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。

六、TCP的有限状态机

TCP段结构,流量&拥塞控制,三次握手四次挥手,有限状态机_第9张图片

你可能感兴趣的:(计算机网络)