ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## TCP首部 > 先来一张图~ 1字节(byte) = 8bit~ ![](https://img.kancloud.cn/12/44/1244c3e3ca6c2414bb1c0565bad75aad_500x329.png) * **TCP端口** * TCP端口就是为TCP协议通信提供服务的端口。(80, 8080之类) * **源端口** * 包含发送数据报的程序所使用端口 * **目的端口** * 接收数据报的程序所使用端口 * **序号** * 序号用来标识从TCP发送端向TCP接收端发送的数据字节流,在一个 TCP 连接中传输的字节流中的每个字节都按照顺序编号,**序号**是本报文段发送的数据组的第一个字节的序号。 > 第一个 TCP 报文段包含的是第一个 25kb 的数据,0 ~ 25599 字节, 该报文的序号的值就是:0 > 第二个 TCP 报文段包含的是第二个 25kb 的数据,25600 ~ 51199 字节,该报文的序号的值就是:25600 > ... * **确认号** * 指明下一个期待收到的字节序号,表明该序号之前的所有数据已经正确无误的收到。确认号只有当ACK标志为1时才有效。 * **数据偏移/首部长度** * 表示报文中除开有效数据段,报文首部的长度。所以数据偏移的最小值是20字节(固定首部)。 * **保留** * 保留,一般置为0。 * **URG** * 紧急指针标志,当URG值为1时,发送方应用程序告诉发送方的TCP有紧急数据需要处理,TCP就将紧急数据放到数据区的最前面。紧跟其后是普通数据。 * **ACK** * 确认序号标志,当ACK=1时,确认号才有效。当ACK=0时,连接都还没建立,不可能传送有效数据。 * **PSH** * push标志,为1表示是带有push标志的数据,指示接收方在接收到该报文段以后,应尽快将这个报文段交给应用程序,而不是在缓冲区排队。 * **RST** * 重置连接标志,用来拒绝一个非法的报文段和拒绝打开一个连接,RST也可称为重建位或者重置位。 * **SYN** * 同步序号,用于建立连接过程,当SYN置为1时,表示连接请求或连接接受报文。 * **FIN** * finish标志,用于释放连接,为1时表示发送方的数据已发送完毕,请求释放连接。 * **窗口** * 滑动窗口大小,用来告知发送端接受端的缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。 > 例如,发送了一个报文段,确认号1001(期望下一个收到的报文中,数据区第一个字节的序号是1001),窗口字段是1000。就是告诉对方:“从1001开始,我最多只能接受1000个字节的数据,你发送数据的时候考虑下这点。” * **检验和** * 发送端对TCP首部、数据进行CRC运算得出的结果。接收端收到数据后,对接收到的TCP报文段的首部、数据进行CRC运算,并跟TCP首部中的校验和进行对比,确保数据在传输过程中没有损坏。 * **紧急指针** * 只有当 URG 标志置 1 时紧急指针才有效。表示紧急数据的长度,指出了紧急数据的末尾在报文段的位置。 * **选项** * 最常见的可选字段是最长报文大小,又称为MSS(Maximum Segment Size),每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志为1的那个段)中指明这个选项,它表示本端所能接受的最大报文段的长度。 * **填充** * 选项长度不一定是32位的整数倍,所以要加填充位,即在这个字段中加入额外的零,以保证TCP头是32的整数倍。 * **数据部分** * TCP 报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。