文章目录
协议实现
- 16位源端端口+16位对端端口:描述通信两端
- 32位序号+32位确认序号:实现tcp传输时的包序管理以及确认应答,因为TCP是一种可靠的协议,当其传送数据报时,会按照字节进行编号,这些编号就是序号。当我向你发送数据时,我需要知道你是否收到以及需要知道你收到了哪些数据,通过确认序号就能知道我发送的数据你收到了哪些。又因为我发送的数据需要你确认,你发送的数据报需要我确认,及双方都需要对对方的报文进行确认,所以既需要序号也序号确认序号。
- 4位头部长度:因为每一层的报文,都需要知道如何将报头与有效载荷进行分隔,通过首部长度就可以达到该目的。这里的4位首部长度的单位是4字节,也就是:4位能表示的最大数据为15,则报头的最大长度为15*4=60字节。由上面的图可以看到,前5行是基本部分,前5行一共占20个字节,所以TCP报头中4位首部长度默认序列为0101(也就是5),所以TCP报头的长度范围为20~60字节,那么选项部分就最多占40字节。
- 6位保留位:为了以后方便扩展
- 6位标志位:URG,ACK,PSH,RST,SYN,FIN
(1)URG:紧急指针标志位
(2)ACK:对报文的确认标志位
(3)PSH:当一方收到携带该标志位的报文时,发送端提示接收端上层的应用层服务赶紧将接收缓冲区的数据读出去,否则接收缓冲区就放不下数据了。
(4)RST:请求重新建立连接,当报文中该标志位被置为1就表示以前建立的连接都无效需要重新建立连接,那么需要断开以前建立的连接,请求重新建立连接。
为什么会有RST?
例1:在电脑上网过程中,如果电脑异常关机之后,连接就无效了,当客户端主机再重新启动时会向服务器请求重新建立连接,那么服务器就要断开以前的连接再重新建立新的连接。
例2:我们可以发现QQ如果长时间不在线就会让图案颜色变淡,但是当我们再次点击的时候就会重新登录。
上面例子可以说明:当连接建立之后,保持连接的时间是有限的,当超过这个时间之后,服务器会发送一个试探报文,多次发送一直没收到客户端的相应就会断开相应的连接,因为服务器保持连接就要占据相应的资源,操作系统还要对其进行维护,如果客户端没有使用就可以断开相应的连接,当需要使用的时候再重新建立连接。
(5)SYN:请求建立连接,用于三次握手中
(6)FIN:请求断开连接标志位,用于四次挥手中
-
16位窗口大小:当我发送数据时,如果不受控制,当我发送的数据超过对方接收缓冲区的大小,那么有些数据包就会被丢弃,但是TCP是可靠协议,为了避免这种问题,所以发送数据时需要知道对方的接收能力,根据对方的接收能力来合适的发送数据,就能为TCP的可靠性提供一个保证。这里的窗口大小就表示的是自己的接收能力(也就是自己剩余缓冲区的大小)。
注意:这里的窗口大小是自己接收缓冲区剩余窗口的大小,而不是对方的,因为这个数据报是要发给对方的,对方自己知道自己剩余缓冲区的大小,但是对方不知道我剩余缓冲区的大小,所以这里的窗口大小是我剩余缓冲区的大小。 -
16位校验和:检验数据一致性
-
16位紧机指针:因为有时候有的数据需要优先被上层处理,但是报文又是按照顺序放在接收缓冲区里,不能破坏顺序,所以紧急指针就可以标识哪部分是紧急数据。
-
0~40字节选项数据:比如建立连接时会协商MSS