1、报文格式
想要连接了解 Tcp连接中的三次握手与四次挥手,必须先要了解报文的格式,不一定非要知道每部分具体是干什么的,至少对下文中加了注解的名词有个大概的印象。以便后文说明。
小知识:一个TCP报文段的数据部分最大长度为多少字节?
一个TCP报文段的数据部分最大长度为65495字节.
原因:TCP封装在IP内,IP数据报最大长度65535字节 ,头部最小20字节。
由上图可知,tcp包括报头和数据,报头包括了固定的20字节以及选项位,选项位长度范围为 0~40 字节,因此TCP头部长度最小20,所以最大封装数据长度为65535-20-20=65495
2、三次握手原理图
3、常问问题
1、三次握手的目的是什么?
三次握手 的机制是为了保证客户端与服务端能够建立安全可靠的连接。分别让客户端与服务端确认自身收、发报文的能力及对方收、发报文的能力。
2、为什么是三次握手,为什么不是2次握手?不是4次握手?
这就要从三次握手的目的出发了,三次握手的目的是为了确认 客户端与服务端收发消息的能力,从能保证安全可靠的连接。
从上面的原理图可知:
第一次握手完成后。客户端什么都不能确认,服务端确认对方发送正常,确认自己接收正常
第二次握手完成后,客户端可以确认
1、 自己发报文1成功了。 (客户端发报文能力)
2、服务端 接报文1成功。 (服务端收报文能力)
3、服务端 发报文2成功了。(服务端发报文能力)
4、自己接报文2成功了。 (客户端发报文能力)
服务端 什么都确认不了。
第三次握手完成后,服务端可以确认
1、 自己接报文1成功了。 (服务端接报文能力)
2、 自己发报文2成功了。 (服务端接报文能力)
3、 客户端接报文2成功了。(客户端接报文能力)
4、 客户端发报文3成功了。(客户端发报文能力)
即:最少经过三次握手,客户端与服务端 才能确认自身收发报文能力及对方收发报文能力。
2次握手不够,4次握手没有意义,所以是3次握手。
3、三次握手时可以携带数据吗?
第一次、第二次握手不可以。第三次可以。
由原理图可知,第二次握手完成以后,客户端已经可以确认自身与对方收发报文的能力了,所以再发报文3时,就可以携带数据了。当服务端收到报文3时,一旦确认了,就可以直接读取数据。
4、四次挥手原理图
第一次挥手完成后,服务端 确认 客户端要断开连接了。
第二次挥手完成后,客户端 确认 服务端已知晓客户端要断开连接了。
第三次挥手完成后,客户端 确认 服务端要断开连接了。
第四次挥手完成后,服务端 确认 客户端已知服务端要断开连接了。
5、为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
进阶:
三次握手与四次过程中客户端与服务端 状态的改变 相关问题
6、为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
答:
1)为了保证客户端发送的最后一个ACK报文段能够达到服务器。 这个ACK报文段可能丢失,因而使处在LAST-ACK状态的服务器收不到确认。服务器会超时重传FIN+ACK报文段,客户端就能在2MSL时间内收到这个重传的FIN+ACK报文段,接着客户端重传一次确认,重启计时器。最好,客户端和服务器都正常进入到CLOSED状态。如果客户端在TIME-WAIT状态不等待一段时间,而是再发送完ACK报文后立即释放连接,那么就无法收到服务器重传的FIN+ACK报文段,因而也不会再发送一次确认报文。这样,服务器就无法按照正常步骤进入CLOSED状态 。
2)防止已失效的连接请求报文段出现在本连接中。客户端在发送完最后一个ACK确认报文段后,再经过时间2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样就可以使下一个新的连接中不会出现这种旧的连接请求报文段。