TCP的三次握手与四次挥手

引言

前段时间一直在准备面试,本觉得准备的挺好,然而被腾讯面试官问道网络问题的时候,发现本身对TCP协议的理解真的是停留在表面,不够深刻。因而本着提升本身的想法,去查了些资料,这里主要是总结我对TCP创建与断开链接过程的理解。你能够在这里看到更好的排版git

常见题目

在面试中网络问题是必定会考察的,而TCP协议则是考察网络知识的重点。常常会被问道的问题以下:github

  1. 请讲一下TCP协议创建链接的过程
  2. 请介绍TCP协议中的三次握手和四次挥手是怎么样的
  3. 为何TCP协议要三次握手来确立链接,而不是两次,也不是4次
  4. TCP链接发起是的syn序号为何不能从同一个序号开始,好比说1

接下来,我将介绍我理解的TCP三次握手和4次挥手的过程,若是错误还请指正,谢谢。面试

TCP协议

三次握手过程

首先须要服务器监听特定的端口,等待客户端来请求链接。当客户端须要创建链接时,客户端会先向服务器发送syn报文,将报文中syn置为随机生成的序号n(这里假设序号为1000)。服务器收到同步报文后,会回复一个ack报文,把ACK位置位n+1(这里的序号应该为1001),同时设置syn为y(这里假设为2000)。客户端收到服务器发送的ack报文后,会回复一个ACK报文给服务器,其中ACK位置为y+1(这里即为2001)。当服务器收到ACK消息后,即认为链接进入稳定状态。状态机与流程图以下:
服务器

四次挥手过程

当client从app接收到关闭指令后,client会给server发送FIN消息(代表client不会再给server发送数据),client进入finish-wait-1状态。server收到finish消息后,回复确认消息ack给client,自身进入close-wait状态。client接收到ack消息后,进入到FIN-WAIT-2状态。而且在此状态等待服务器发送finish消息。当server接收到app的关闭指令后,server给client发送FIN消息。服务器进入到LAST-ACK状态。客户端收到FIN消息后,会回复ACK消息,同时进入到TIME-WAIT状态,来等待server收到ack消息,客户端会在接下来的2MSL(maximum segment lifetime)的时间内保持TIME-WAIT状态。为何是2MSL时间呢,一是为了server有足够的时间收到ACK消息,并在消息丢失时重发。二是为了在此链接结束后的后续链接提供缓冲期。若是不是2倍MSL的话,就可能混合来自不一样链接的数据包,形成消息混乱。状态机与流程图以下:网络

完整过程

如下为TCP从创建链接到断开的完整流程图app

开始答题

有了上面的介绍,基本可以回答前两个问题。tcp

请讲一下TCP协议创建链接的过程

看上面ide

请介绍TCP协议中的三次握手和四次挥手是怎么样的

看上面ui

为何TCP协议要三次握手来确立链接,而不是两次,也不是4次

首先呢,根本不存在可靠的链接,tcp只是提供相对可靠的链接。三次握手的主要目的是交换通讯须要的参数,主要是server与client的syn序号,这个序号是用于收发数据的。若是只有两次握手的话,当服务器发送ack+syn消息后,就会认为创建了稳定链接,这个时候若是ack+syn丢失了,client并无收到这个消息,那么客户端就会认为链接创建不成功,而直接进入close状态。这样就会形成,server一直在哪傻等,永远不会有client来发送数据,这就会形成服务器资源的浪费。至于为何不是四次握手,是由于握手三次成功之后,就能够认定当前链接是可靠的了,否则的话还须要client与server互相之间发送ack消息,这样就无休无止了。.net

TCP链接发起是的syn序号为何不能从同一个序号开始,好比说1

由于现实中的网络情况不可预知,好比说客户端在第一次链接时,使用序号为1为初始序号进行数据发送,发送了1到30的数据片断,这个时候由于网络问题断开了链接。而后客户端是syn为1从新创建了新的链接,这个时候服务器收到了以前发送的30个字节的数据,服务器就会觉得这30个字节的数据是新发的,这就会致使数据混乱。

参考资料

说明,本文全部图片均来自The TCP/IP Guide

参考资料以下:

The TCP/IP Guide

TCP为何须要3次握手与4次挥手

TCP三次握手四次挥手详解

相关文章
相关标签/搜索