TCP内功心法
网络通信靠协议,经典协议TCP。
可靠传输无人比,润物无声似空气。
确定源头与目的,各十六位不可弃。
先传序列后确认,确认号码要加一。
四位首部偏移量,6位保留无含义。
六位协议状态位,最为重要无可替。
紧急指针URG,需要用时方为1。
确认标记标记ACK,一为有效零放弃。
PSH标志推应用,置为一时表完毕。
重连标志RET,网络异常很来气。
SYN同步位,网络连接要建立。
FIN完成位,值位一时将关闭。
窗口大小一十六,缓存大小别随意。
一十六位校验位,保证可靠最有力。
紧急指针十六位,顺序累加发紧急。
选项字段自定义,时间大小EOP。
数据字段为内容,发送信息很随意。
1.确定源头与目的,各十六位不可弃
每次TCP通信都要表明信息发出的端口以及信息要被发送到的端口。就像写信一样,我们要写好是谁发出的,并且是要发送给谁。
2.先传序列后确认,确认号码要加一
TCP作为可靠传输的协议,每次传输都要保证数据的顺序,所以每次发送数据的时候,都会带有一个数据包的序号。
当接收方成功的接收到数据之后,回返回一个确认号码,确认号码为传输序号的值加一。
例如:当前发送的数据包的序号是1001,当接收方成功接收到数据之后,回返回1002,表示刚才的数据已经收到,并且请求第1002号数据包。
3.四位首部偏移量,六位保留无含义
首部偏移量有4bit,TCP协议的首部除了默认的20字节以外,用户还可以自定义一部分协议选项,所以需要通过首部偏移量来确定TCP首部实际有多长。
在四位首部偏移量之后,是连续6位的保留空间,当前没有任何含义,默认值为0。
4.紧急指针URG,需要用时方为一
当TCP协议需要传输临时的比较紧急的信息时候,会将URG字段置为1,当URG字段置为1之后,十六位紧急指针字段生效。
十六位紧急指针指的是紧急数据的大小。
传输序列号 加 紧急数据偏移量 为紧急数据的最后一个字节。
紧急指针URG并不常用,因为在TCP协议早期的时候,NFC规范定义 传输序列号 加 紧急数据偏移量 为紧急数据的最后一个字节加一,所以当时许多的TCP服务都是按照这种规范来进行设计的,但是这其实是NFC规范的一个错误,后来NFC规范纠正了这个错误,将传输序列号加紧急数据偏移量定义为紧急数据的最后一个字节。
所以当前的TCP服务有很多是遵循早期的NFC规范的,其中包括许多比较著名的机构,所以我们并不建议使用紧急指针。如果我们需要通过发送临时数据来通知接收端的时候,我们完全可以再开启一个TCP连接。
5.确认标记ACK,一为有效零放弃
当发送方发出一个数据包之后,如果接收方成功的接收到了这个数据包,就会将ACK字段标记为1,表示成功接收到数据包。
在很多公司中,当有人在群里发了一个通知之后,我们会发现会有很多人在群里回复ACK,这个梗就是出自这里。
6.push标志推应用,置为一时表完毕
当数据发送完成时,发送方会将push标志位(PSH)标记为1,当接收方接收到的数据包中的PSH标志位为1的时候,会将接收到的数据推送给应用层。
7.重连标志RST,网络异常很来气
实际的网络传输中,很有可能出现网络抖动或者断网的现象,当网络恢复的时候,发送失败的一方会重新发送信息,并将RST标志位标记为1,表示请求重连。
8.SYN同步位,网络连接要建立
当TCP连接刚开始建立的时候,请求方会将SYN信号位标记位1,表示请求建立连接,如果接收方成功的接收到了请求方的连接请求,在返回信息的时候,会将SYN标记位标记为1,表示成功地建立了连接。
9.FIN完成位,值为一时将关闭
当发送方将信息发送完成的时候,会将FIN标志位置为1,表示信息发送完毕,当接收方将最后一个数据包接到之后,也会将FIN状态位标记为1,表示所有的数据都接收完毕。当两方的都发出过FIN为1的信息之后,连接就会关闭。
10.窗口大小一十六,缓存大小别随意
窗口大小就是发送方一次发送信息的数据量,这个数据量取决于接收方的缓存大小,为了将TCP信息的传输效率最大化,一般我们的窗口大小不会大于当前剩余的缓存大小,以保证每次的数据传输都能进入缓存区。
11.一十六位校验位,保证可靠最有力
TCP作为可靠的传输协议,不但要保证数据传输顺序的正确,还要保证数据在传输过程中不会出现错误。
根据RFC 793的TCP校验和定义,首先,把伪首部、TCP报头,TCP数据分为16位的字,如果总长度为奇数个字节,则在最后添加一个位都为0的字节。把TCP报头中的校验和字段设置为0。然后,用反码相加法累加所有的16位字(进位也要累加)。最后,对计算结果取反,作为TCP的校验和。
12.紧急指针十六位,顺序累加发紧急
详细内容见第四点,紧急指针URG。
13.选项字段自定义,时间大小EOP
TCP字段的头部不止有默认字段的20字节,用户还可以使用一些自定义的首部字段,比如时间,内容大小,还有结束标记EOP。