愿你坚持不懈,努力进步,进阶成自己理想的人

—— 2017.09, 写给3年后的自己

TCP的三次握手与四次挥手

TCP的三次握手

1、TCP连接的建立

因为TCP是一个面向连接的协议,所以需要事先建立连接(就像是打电话的时候,要拨号);而TCP的三次握手发生在建立连接的时候,它的过程如图:

发起连接请求的一方称之为客户机(Client),接受请求的一方称之为服务机(Server)

  • 客户机处于主动打开的状态,首先发起同步命令(想建立请求的命令)SYN
  • 服务机处于被动打开的状态,它一直等待着有人来和它连接。这时候,它收到了客户机发过来的同步请求,为了表示自己收到了这个请求,它需要给对方给予确认,于是回应一个SYN、ACK的报文
  • 最后,客户机再给服务机发送一个ACK报文,代表着握手的结束,一个TCP连接就成功建立了

2、为什么TCP连接需要三次握手,而不能是两次握手?

三次握手是为了防止失效的请求建立连接报文传送到服务机,从而产生错误的现象

  • 假设可以两次握手。当客户机的SYN报文发送给服务机后,由于某种原因,比如说客户机在发送请求连接后,就离线了,然后SYN报文到达服务机,这时候服务机会回应一个SYN、ACK报文给客户机,如果允许两次握手,那么这时候服务机就会以为连接已经成功建立了,然后一直等待着来自客户机发来数据,然而客户机已经离线了,这种情况下就会白白浪费许多服务机资源
  • 三次握手情况下,只要三次握手的其中任何一个环节失效,就会重新开始三次握手。上述的情况,如果客户机没有再给予ACK,那么连接就建立不起来,服务机也就不会等待客户机传送数据



TCP的四次挥手

  • 客户机首先发送一个FIN给服务机,通知服务机自己已经不再发送数据了(但是在FIN包之前发送的数据,如果没有收到来自服务机的ACK报文,那么客户机还是可以重传的)
  • 服务机收到FIN后,会给客户机ACK确认,并且不再接收来自客户机的数据,也就是说这时候客户机->服务机的连接就已经关闭了,此时TCP连接处于半关闭的状态(客户机还可以接收来自于服务机的数据)
  • 当服务机也没什么要发送了的时候,它就会给客户机再发送一个FIN、ACK报文,通知客户机自己也没有数据要传送了,但是这时候它还不能马上关闭服务机->客户机的连接,得等一个超时的时间,因为客户机的确认报文有可能丢失,如果丢失的话,那么服务机还得重传FIN、ACK报文
  • 客户机需要最后向服务机发送一个ACK报文,服务机收到这个ACK报文后,就会马上释放掉服务机->客户机的连接,如果超时时间后,没有收到来自于服务机的FIN、ACK报文,那么就表明服务机已经收到ACK报文了,此时整个TCP连接完全终止