当前位置: 首页 > news >正文

TCP专题

一、TCP的连接建立

1、什么是面向连接

TCP属于面向连接:在发送数据之前,需要建立点到点的连接。

TCP的四元组:源ip,目标ip,源端口,目标端口。可以唯一的区分和标识一条TCP的连接。

TCP和UDP的差异:
TCP:一对一;BGP(看重传输的可靠性)使用的是TCP协议。
UDP:一对多;RIP,OSPF都是使用的UDP协议。

连接:指的是逻辑层面的连接,本质是初始参数的约定。

2、TCP的报文结构

首部长度:标识TCP报文头部的长度,因为存在选项字段,所以是可变长头部,最短是20个字节。

URG:紧急标记位,应用层定义,为1,则启用紧急指针。

ACK:确认标记位。为1,Acknumber=1+上一个报文的字节长度 ,则启用确认序列号字段。

PSH:推送标记位。为1,表示该报文不放入缓存空间,直接推送至进程。

RST:重置标记位。为1,表示强制断开TCP连接,不用四次挥手。

SYN:同步标记位。为1,表示请求建立连接,通常在三次握手的前两次用到。

FIN: 止标记位。为1,表示正常断开TCP连接,需要四次挥手。

窗口大小:进行流量控制,保障可靠性。

校验和:伪头部校验,校验自己的头部内容兼带数据内容,还会校验IP头部的部分字节(12个字节:32位源IP 32位目标ip 8位的保留 8位的协议号 16位的报文长度)。

序列号:TCP是基于字节流传输的协议,这个序列号就是字节流的编号。

3、TCP的三次握手

第一次握手:客户端向服务端发送请求,SYN置1,携带客户端生成seq序列号。

第二次握手:服务端向客户端回报,SYN和ACK置1,携带服务端生成的seq序列号和ack确认序列号。

第三次握手:客户端向服务端回报,携带ack确认序列号。

思考1:为什么不能使用固定的序列号?

  • 保证接收端数据有序接收;

  • 可以根据序号判断是否以前接收过该数据,用于去除重复;

  • 判断数据的合法性;

  • 序号机制结合 ACK 可以完成数据重传。

思考2:为什么序列号不从0开始?

防止黑客知道序列号后伪造数据包制造攻击

4、TCP的建立状态

客户端:

  1. 关闭状态:在发送SYN请求建立连接之后,进入到下一个状态;
  2. SYN_SENT:等待服务器返回的SYN-ACK报文,收到后进入下一个状态;
  3. 建立完成状态:此时客户端指向服务器的会话已经建立,所以客户端发送给服务器的最后一个ACK报文是允许携带数据的。 

服务器:

  1. 关闭状态:当服务器应用创建一个监听的套接字之后,将进入下一个状态;
  2. 侦听状态:当接收到客户端发送的SYN报文之后,为TCP连接分配缓存空间,同时发送SYN-ACK报文,进入到下一个状态;
  3. SYN_RCVD:等待客户端返回的ACK报文,收到后进入下一个状态;
  4. 建立完成状态:TCP双向会话均建立完成。

在第一次握手时,若服务器没有开启listen侦听,在收到SYN报文时,会将回复报文的RST位置1,拒绝建立连接。

5、SYN泛洪攻击

SYN泛洪攻击属于DOS攻击的一种,攻击者通过伪造大量的源IP地址,向服务器发送大量的SYN包,分配缓存空间,而服务器回复SYN-ACK报文后,由于源 IP 虚假无法收到 ACK 包,致使连接资源被半开放连接占满,从而无法给正常用户提供服务。

防御方式:

①:防火墙代理

防火墙代理服务,并设置每目标IP代理阈值和每目标IP丢弃阈值。一开始,客户端正常访问服务器,达到代理阈值后,防火墙开始代理服务;达到丢弃阈值后,防火墙直接把数据包丢弃。 

②:SYNcookie

服务器在收到SYN数据包后不会分配缓存空间,而是将(四元组+一个随机数)提取出来做一个hash运算,将生成的摘要值(SYNcookie)作为序列号回复给客户端,同时保存摘要值+1的数值,在进行一次hash,检验结果是否与客户端返回的Ack报文是否一致。

6、TCP建立连接为什么必须是三次握手(为什么不是四次或者两次)

三次握手相较于四次握手节省资源资源。

三次握手相较于二次握手,能够解决新旧连接造成资源混乱的问题。

二、TCP的断开连接

1、四次挥手

客户端和服务器都能主动断开连接,这里以客户端作为示例。

  1. 当数据快发送完时,客户端发起FIN报文时,将最后一点数据合并在FIN包中;
  2. 服务器回复ACK报文时,断开的是客户端指向服务器的单方面会话,此时,客户端不能给服务器发送数据,而服务器可以继续发送剩下的数据;
  3. 等待服务器将数据全部发送完后,再继续发送FIN报文,该报文也可以携带最后一段数据;
  4. 客户端回复ACK报文后,双方连接彻底断开。

2、TCP的断开状态

客户端和服务器都可以先请求断开连接,谁先请求为客户端。

客户端:

①:建立完成状态:发送完所有的字节流,携带最后一组字节流的数据同时将FIN标记位置1,之后,进入到下一个状态。

②:FIN_WAIT_1:等待服务器回复ACK,收到ACK应答后,进入到下一个状态。

③:FIN_WAIT_2:等待服务器发送FIN断开请求,将回复ACK进行确认,进入下一个状态。

④:TIME_WAIT:等待2MSL时间后进入到下一个状态。

⑤:CLOSE:关闭状态,断开TCP连接,释放所有TCP连接占用的资源。

服务器:

①:建立完成状态:收到客户端发送的FIN断开请求后,服务器将回复一个ACK确认报文,进入到下一个状态。
②:CLOSED_WAIT:等待服务器自身数据的发送,当自身所有数据传递完毕后,发送FIN断开请求,进入下一个状态。
③:LAST_ACK:等待客户端进行最后的ACK应答,当收到客户端发送的ACK确认报文之后,进入到下一个状态。
④:关闭状态:断开TCP连接,释放所有TCP连接占用的资源。

3、为什么要求TIME_WAIT状态

保证TCP会话可以正常关闭

4、TIME_WAIT为什么是2MSL

MSL:报文最大生存时间

原因:

1.最后一个ACK报文丢失的情况下,能够等到对方重传,一来一回正好两个MSL时间,可以保证TCP会话正常断开。

2.设置2MSL,足以让两个方向上的报文都丢弃,再出现新的连接时,不至于被历史报文造成数据错乱。

3、时间太长导致资源浪费。

5、为什么TCP挥手是四次

在服务器收到FIN报文时,可能还存在未发送完的数据,因此只回复了ACK报文,等待剩余的数据发送完毕则发送FIN报文断开连接。四次挥手过程是理论上的形式,实际情况中,存在三次挥手,即服务器正好发完了数据,将直接回复ACK-FIN报文。

三、TCP的可靠性传输

1、排序机制

分段:TCP是一款基于字节流的协议。

MSS:最大段长度,TCP在建立三次握手时前两个SYN报文中,携带有该参数,并且双方的该参数允许不同,如果不同则按照数值小的执行(MTU为默认值时,MSS的最大值为1500-网络层的头部20-传输层的头部20=1460字节)。

分片:网络层的IP协议执行,当数据包过大时,将数据包进行分片传输。

MTU:最大传输单元,默认值是1500字节。

排序机制是基于序列号来完成的,过程如下图:

2、确认机制

TCP为了保证对方能够收到本端发送的数据段的方法,是让对方回复一个确认报文段。实际上确认序列号ack是期望收到的下一个seq序列号。

3、超时重传

超时重传:本端在一定时间内,没有收到对端反馈的确认报文而触发的重传机制。

RTO:超时重传时间。

RTT:往返时间,指的是发出端将数据发出后,到他接收到对端返回的确认报文之后的着一段时间。

RTO过长:丢包之后,重传的效率降低,无法及时做出响应。

RTO过短:丢包之后,导致大量不必要的重传,导致网络负荷加大。

RTO值在计算时,需要略大于RTT,因为RTT是一个可变化的值,所以RTO也是一共动态变化的值。

超时间隔加倍 :每次发送重传报文之后,会将RTO设为上一次RTO的两倍时间。

4、快速重传

接收方收到一个数据段中的序列号大于自己期望的序列号,称为失序报文。

通过冗余ACK(Duplicate ACK),将缺失的报文段连续发送三遍,这时发送方收到后触发快速重传机制,将seq=200的报文重新发送。

5、SACK(选择确认机制)

在快速重传机制中,接受方在回复冗余ACK时,里面将携带自身已经接收到的数据信息,避免重复发送造成资源浪费。

6、三次握手的可靠性保障

7、四次挥手的可靠性保障

四、TCP的流量控制

五、TCP的拥塞控制


http://www.mrgr.cn/news/100381.html

相关文章:

  • IT社团分析预测项目(pandas、numpy、sklearn)
  • Vue前端学习笔记
  • ​Stable Diffusion:Diffusion Model
  • FPGA设计 时空变换
  • 【Go语言】RPC 使用指南(初学者版)
  • java 富文本转pdf(支持水印)
  • DeepSeek智能时空数据分析(三):专业级地理数据可视化赏析-《杭州市国土空间总体规划(2021-2035年)》
  • 桌面端开发技术栈选型:开启高效开发之旅
  • 线程池单例模式
  • gem5-gpu教程04 高速缓存一致性协议和缓存拓扑
  • (六)RestAPI 毛子(外部导入打卡/游标分页/内存缓存/批量提交/Quartz后台任务/Hateoas Driven)
  • DataStreamAPI实践原理——计算模型
  • 前端面试宝典---vue实现简化版
  • 上位机知识篇---寻址方式
  • 2025蓝桥省赛c++B组第二场题解
  • Spring Bean生命周期原理、常见的后处理器实现
  • C#中常见的设计模式
  • 【Linux应用】交叉编译环境配置,以及最简单粗暴的环境移植(直接从目标板上复制)
  • Unity接入火山引擎/豆包大模型文生图,实现AI绘画
  • WSL 安装过程整理