当前位置: 首页 > Linux

TCP协议概要

时间:2023-04-06 23:35:49 Linux

TCP头部固定结构16位源端口号16位目的端口号32位序列号32位确认码4位头部长度6位保留6位标志16位窗口大小16位校验和16位紧急指针选项(最多40个字节)a.16位源端口值和目的端口号,数据来自的程序的端口号。因为传输层是端到端的协议,所以从TCP头可以看出只有源端口号和目的端口号。在TCP中,客户端一般使用系统动态分配的端口号,每个系统的动态端口号范围不同。服务器通常使用众所周知的端口,例如用于Web服务器的端口80。b.32位序列号,TCP使用唯一的序列号来标识每个字节流。初始值由双方系统赋予一个随机值ISN,后续每个字节加1。在三次握手中,虽然syn同步数据报的数据长度为0,但它占用了一个单独的序号,比较特殊。C。32位确认码,用于确认和回复对方的TCP数据段是否到达。它的值是它要确认的数据段的序号加1。每条TCP报文不仅携带自己的序号,还携带前一个数据的确认号。这就是TCP数据报可靠的原因之一,确认机制。d.4-bitheaderlength和IP4-bitheaderlength相似,所以最长的header是60字节(15*4)。e.6个标志位:(1)URG标志位:表示紧急指针是否有效。(2)ACK标志:表示确认码是否有效。我们把携带确认码的报文段称为确认报文段。(3)PSH标志:提示接收端应用程序立即从接收缓冲区中取出数据,以便存储后续数据。(如果应用程序不取数据,数据会一直留在TCP接收缓冲区)。(4)RST标志:该标志要求对方重新建立连接。带有RST标志的段称为复位段。(5)SYN标志:表示请求建立连接。带有SYN标志的报文段为同步报文段。(6)FIN标志:表示通知对方本端即将断开连接。携带FIN的段是结束段。F。16位窗口大小是TCP控制流量的一种手段。这里的窗口指的是接收通知窗口,就是告诉对方自己的接收缓冲区可以接受多少数据。对方可以控制发送数据的速度。G。16位校验和,由发送方填写。接收端用来检查TCP报文段的传输是否有错误。这个校验和包括了校验和数据部分,这是TCP可靠的一个重要原因。IP在检查校验和时只检查头部信息。H。16紧急指针,发送方用来向接收方发送紧急数据。是一个正的偏移值,当前序号加上这个偏移值就是下一个数据段的序号。我。TCP标头选项:种类(1字节)长度(1字节)信息种类=0种类=1种类=2长度=4最大段长度(2字节)种类=3长度=3个移位位(1个字部分)种类=4长度=2kind=5length=N*8+2Nedgeblockskind=8kind=0:选项表结束选项。kind=1:无操作选项,无特殊含义。一般用于将TCP选项的总长度加到4字节的倍数。kind=2:最大段长度选项。建立连接时,连接双方都会发送最大报文段长度进行协商。TCP模块通常设置MSS(maxsegmentsize)为MTU-40(减去20字节的TCP头长度和20字节的IP头长度,不考虑选项长度),这样发送的最大段长度就会不超过MTU并避免IP分片。对于以太网,MSS为1500-40,即1460字节。kind=3:窗口放大因子选项。建立链路时,通信双方将根据该选项协商窗口扩展因子的大小。窗口大小在TCP头中用16位表示,所以最大为65535。但是在实际传输过程中,窗口的大小要比这个大很多,因为需要更大的网络吞吐量,所以窗口扩展系数是必需的。扩展方法是每次将初始窗口值左移一位扩展因子值。一般扩展因子选项为0~14,我们可以修改/proc/sys/net/ipv4/tcp_window_scaling的内核变量来启用或禁用窗口扩展因子选项。和maximumsegment选项一样,只能出现在同步段中,否则会被忽略。kind=4:可选的确认选项。在TCP通信中,如果一个报文段丢失,TCP会重新发送这个报文段以及后面的所有报文段,这样就会存在一个问题,之前发送的迟报文段会重新发送,这样就会出现重复的数据传输,这将大大降低TCP的传输效率。选择性确认选项(SACK)就是用来改善这种情况的,它可以使TCP只发送丢失的报文段,而不必重复发送。在连接初始化时也使用SACK来表示是否支持SACK。我们可以通过修改/proc/sys/net/ipv4/tcp_sack内核变量来启用或禁用选择性确认选项。kind=5:SACK的工作选项。每两个块表示一个连续的数据段区间,左边表示连续数据段的第一个数据序号,右边表示最后一个数据段序号的下一个序号。然后SACK可以根据间隔确认哪些数据还没有收到,从而重发丢失的数据段。因为一个section占8个字节,所以一个TCP数据段最多有4个这样的blockkind=8:时间戳选项。它用于更准确地计算通信双方之间的往返时间(RTT),为TCP流量控制提供重要信息。我们可以通过proc/sys/net/ipv4/tcp_timestamps内核变量启用或禁用时间戳选项。##TCP连接超时##使用客户端连接服务器,然后使用iptable命令过滤丢弃所有服务器端的连接请求包,模拟网络异常,让其重连。然后使用tcpdump抓包观察TCP超时重连。一共有六个同步报文段,第一个是第一次请求,接下来的五个应该都是超时重连发送的请求。它们的时间间隔分别为1s、2s、4s、8s、16s。因此,TCP总共进行了5次重连。这个数字在proc/sys/net/ipv4/tcp_syn_retries中定义。当5次重连失败时,TCP将放弃连接并通知应用程序。

猜你喜欢