其他分享
首页 > 其他分享> > 详解TCP三次握手(建立TCP连接过程)

详解TCP三次握手(建立TCP连接过程)

作者:互联网

在讲述TCP三次握手,即建立TCP连接的过程之前,需要先介绍一下TCP协议的包结构。

这里只对涉及到三次握手过程的字段做解释

(1) 序号(Sequence number)
我们通过 TCP 协议将数据发送给对方,就比如 hellotcp,这一串字节流,假设被拆分成了三个 TCP 报文段,第一个报文段携带了 hel,第二个报文段携带了 lot,第三个报文段携带了 cp,这三个报文段不一定是按照顺序送到对端的,那么对端收到这三个段是如何确定他们的顺序的呢?此时序号的意义就体现在这里。

TCP 连接中,为传送的字节流(数据)中的每一个字节按顺序编号。也就是说,在一次 TCP 连接建立的开始,到 TCP 连接的断开,你要传输的所有数据的每一个字节都要编号。这个序号称为字节序号。

举个例子:如果一个 TCP 报文段的序号为 101,它携带了 50 字节的数据,就表示这 50个字节的数据的字节序号范围是 [101, 150],该报文段携带的第一个字节序号是 101,最后一个字节序号是 150。

(2) 确认号(Acknowledge number)
TCP传输的对端通过回复一个确认号,来表示确认已经接收到了某个 TCP 段。

举个例子:比如之前发送方发送的序号为 101 的 TCP 段,这个段携带了 50 字节数据,则接收方应当回复的确认号是 151,它表示接收方已经收到了字节序号为150之前的数据,现在期望你发送字节序号为 151 以及以后的数据。

(3)ACK
是一个TCP协议报文中的标志比特位,如果置1表示这个报文段是一个回复确认报文。

注意:为了防止混淆确认号与ACK,一般确认号写作ack,而ACK就写为ACK。

(4)SYN
同样是一个TCP协议报文中的标志比特位,如果置1表示该报文段用来建立TCP连接。

介绍完TCP协议报文的一些基本字段,我们可以来叙述TCP三次握手的过程了。

TCP三次握手流程图

这里用C/S(客户端/服务器端)模型,客户端向服务器端请求建立TCP连接来举例:

(1)第一次握手
客户端(Client)向服务器(Server)发送一个SYN段(在 TCP 标头中 SYN 位字段为 1 的 TCP/IP 数据包),该段中也包含一个客户端的初始序列号(Sequence number = x,seq)。

(2)第二次握手
服务器端返回一个 SYN +ACK 段(在 TCP 标头中SYN和ACK位字段都为 1 的 TCP/IP 数据包),该段中包含服务器的初始序列号(Sequence number = y)。同时使 Acknowledgment number = x + 1来表示确认已收到客户端的 SYN段(Sequence number = y)。

(3)第三次握手
客户端给服务器响应一个ACK段(在 TCP 标头中 ACK 位字段为 1 的 TCP/IP 数据包)(SYN已变为0), 该段中使 Acknowledgment number = y+ 1来表示确认已收到服务器的 SYN段(Sequence number = y),自己的序列号则是变成seq=x+1。

常见面试问题:为什么是三次握手,不能是两次握手吗?

答:如果只是两次握手,那么按照上述C/S模型的流程,第二次握手后服务器端会认为自己已经与客户端建立了连接,假如此时网络出现问题,丢失了第二次握手的报文。那么客户端没有收到应答报文,他认为与服务器端并没有建立连接,那么之后服务器端向客户端发来的消息,客户端并不会接受,而是一直等待应答报文,会形成类似死锁的问题。

标签:字节,握手,TCP,详解,序号,报文,客户端
来源: https://www.cnblogs.com/ranger30/p/16293953.html