TCP传输管理协议

TCP传输管理协议

滑动窗口:TCP是一种面有序的、可靠的、有连接状态的字节流传输协议TCP要保证可靠,需要对每一个数据包进行ACK确认后才能发送下一个数据包,有了滑动窗口,发送端在发送完一个数据包后可以不用等待它的ACK,只要新包的Seq与没有得到确认包的最小seq之差小于滑动窗口大小,就可以继续发送新包,接收端可以在接收了多个包后 只发送一个ACK.

1、TCP数据包格式

  • CWR:表明拥塞窗口已经降低(发送速率减缓了)
  • ECE:ECN回显位,当接收端收到被拥塞路由器标记在IP层的ECN标记包后,发送ACK包会回显ECE标志位以告知发送端网络出现拥塞
  • URG:紧急指针
  • ACK:确认包
  • PSH:表明接受方应该尽快给应用程序传送这个数据(实际没什么用)
  • RST:重置包
  • SYN:同步包
  • FIN:结束连接数据报
  • 窗口大小:用于通告本段缓存的剩余容量(即时能接受的最大数据量)
  • 头部长度:由于头部长度的单位位4字节,所以TCP选项头部必须填充到4字节的倍数位

确认号、ECE、ACK、窗口大小这几栏是由接收端填写的


2、TCP选项

由于头部长度只有4位,且单位为4字节,所以TCP Options的最大长度为40字节(15*4-20)

  • 每个选项的头一个字节位类型值,指明了该选项的类型,后一个字节指明该选项头部的长度(TLV格式)。
  • 不能被理解的选项会被简单地忽略掉

1、 MSS:最大报文段大小:

允许从对方接收到的最大报文段(不包括TCP和IP头部),通讯双方发送数据时,数据包大小必须小于等于对方声明的MSS的大小。MSS一般在SYN包中携带,如果SYN包中没有声明MSS,则默认位536字节(576-20-20)

2、SACK:选择确认选项:

由于滑动窗口的使用,使得发送方可以不用等到ACK继续发送数据,当接收方接受到的数据包序列号不连续时(中途有失序或丢包)SACK用于说明收到的不连续的数据包的序列号值,以便发送方更好的组织重传)

发送方必须在SYN包中携带SACK-Permitted选项,接收端才能使用SACK选项

SACK信息保存在SACK选项中,包含了接收方已经成功接收到的数据块的序列号范围,每一个范围被称为一个SACK块由一对32位的序列号表示,因此如果一个SACK中含有n个SACK块,则SACK选项头长度为(8n+2)(2中1个字节表示SACK选项类型,一个表示SACK选项长度)

3、WSOPT:窗口缩放选项:

TCP固定头中窗口大小为16位,使用窗口缩放选项可以将窗口大小增大为16位~30位,最大容量达到1GB,WSOPT选项只能出现在SYN包中

4、TSOPT:时间戳选项:

发送方在每一个报文段中添加2个4字节的时间戳数值,当发送数据包时,发送方将一个32位的当前时间戳数值填充TSV字段中作为时间戳选项的第一部分,而接收方则将收到的时间戳数值原封不动地抄写在第二部分时间戳回显字段TSER

时间戳的作用:

  • 1、通过时间戳可以测量RTT值(RTT=收到ACK时间-时间戳的发送时间)
  • 2、防止序列号回绕:由于序列号的位数是有限的,当使用完所有的序列号后会重新使用使用过的序列号(如最开始序列号从0开始,当一直到2的16次方-1后,又会从0开始)

5、UTO:用户超时选项:

指明了发送方愿意等待对方的ACK的时长,是一个建议性的行为,接收方可以通过这个时长来调整自己的确认行为,也可以不做参考


3、TCP连接的建立和终止

1、 初始序列号(ISN):

客户端或服务器端最开始建立连接时都会生成一个随机正数来作为初始序列号(为了防止伪造IP来破坏连接,也为了区分不同的连接实例使用不同的初始序列号),系统不同初始序列号生成的函数是不同的。

Linux系统的ISN:半随机的方法,基于时间的,在建立连接时会随机生成一个时间偏移(偏移量时通过基于4元组的加密哈希函数计算出来的),以偏移后的时间值为ISN

2、 TCP半关闭:FIN_WAIT_2状态

  • socket调用shutdown()函数时本端会发送一个FIN包,表示本端已经没有数据待发送,但仍然希望接受对端的数据,直到对端发送FIN包才进入TIME-WAIT状态,如果没有收到对端的FIN本端将一直处于FIN_WAIT_2状态,就称为半关闭状态
  • socket调用close()为常规完全关闭,本端会主动发送一个FIN包,表示本端没有数据要传送也没有数据需要收取,进入FIN_WAIT_2状态会设置一个计时器,当计时器的时间超时时如果连接仍然处于闲置状态,本端将会自动转化为CLOSED状态。Linux系统:变量net.ipv4.tcp_fin_timeout值记录计时器的秒数值,默认为60s

4、TCP状态转换

1、TIME_WAIT状态

  • 当主动关闭连接的那端在收到对端发过来的FIN,发送了最后一个ACK后进入TIME-WAIT状态,
    当两端同时发起关闭连接时,两端发送完最后一个ACK都会进入TIME-WAIT状态
  • TIME-WAIT状态的时长为2倍的MSL时间,之后自动转化为CLOSED状态(MSL(maximum segment lifetime):报文最大生存时间,RFC规定为2m,(OS系统实现有所不同)实际常用30s,1m或2m,Linux默认为30s,可以自行设置参数值)
  • TIME_WAIT存在的目的:1、主动关闭的一端发送最后一个ACK后进入等待状态,当最后一个ACK没有被对端收到时,对端会再次发送FIN直到收到主动关闭方再次发送的ACK为止,所以是为了确保最后一个ACK被对端收到;2、为了保证此次连接发送的所有数据包(延迟到达的)都在网络中消失,不允许下一个连接收到上一个链接的数据包
  • TIME-WAIT状态下的影响:处于TIME-WAIT状态下的连接,该连接在2个MSL时间内仍然没有释放不可以被再次建立四元组完全相同的连接(各系统实现有所不同)Linux系统:处于TIME-WAIT状态的连接端口暂时禁止连接复用(既通过相同的端口号再次发生请求到与上次相同的地址和端口号),但可以使用SO-REUSEADDR选项来强制复用Windows系统:只防止完全匹配(2边端口号和地址)的处于TIME-WAIT状态的出站连接(即主动发连接请求)的建立,而不限制入站连接(即被动回应对方的连
    接)的建立,处于TIME-WAIT状态的终端收到的segment都会丢弃,所以处于TIME-WAIT状态都会超时,需要对端对超时进行处理
    其他系统:采用更严格的限制,处于TIME-WAIT状态的连接的端口会被暂时禁止所有进程使用(其他地址的连接也不可以使用这个端口)直到2倍的MSL时间,当同时有很多个连接处于TIME-WAIT状态时,会同时有多个端口号不能用,造成端口短缺
    由于系统需要分配内存块来记录每个处于TIME_WAIT状态的连接,因此如果系统中存在大量处于TIME_WAIT状态的连接时会使得操作系统的速度严重减缓

安静时间:当处于TIME-WAIT状态的主机崩溃并在2倍MSL时间内重启连接时(为了防止崩溃前延迟的数据干扰新连接)TCP需等待1个MSL的时间才能重启连接,这个时间就叫做安静时间

TIME-WAIT状态暗杀:当处于TIME-WAIT状态的本端收到延迟到达的数据包时会发送一个ACK给对端,对端已经处于CLOSED状态因此会发送一个RST包给本端,本端会过早退出TIME-WAIT状态进入CLOSED状态,这种情况叫做TIME-WAIT暗杀(OS应该阻止TIME-WAIT暗杀如处于TIME-WAIT状态时收到RST包不作出任何反应)


5、TCP连接同时开启与同时关闭

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值