面试必备TCP三次握手

概念

在进入本篇文章正题之前,需要先了解一下关于TCP连接过程中使用的关键字含义。
序列号seq:标记数据段的顺序。
TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;
给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。
确认号ack:期待收到对方下一个报文段的第一个数据字节的序号;
序列号表示报文段携带数据的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;因此当前报文段最后一个字节的编号+1即为确认号。
同步SYN:连接建立时用于同步序号。
当SYN=1,ACK=0时表示:这是一个连接请求报文段。若同意连接,则在响应报文段中使得SYN=1,ACK=1。
SYN=1表示这是一个连接请求,或连接接受报文。
SYN这个标志位只有在TCP建产连接时才会被置1,握手完成后SYN标志位被置0

确认ACK:仅当ACK=1时,确认号字段才有效。ACK=0时,确认号无效。
终止FIN:表示释放一个连接。FIN=1,则表示发送方的报文段数据已经发送完毕,并请求断开连接。

TCP三次握手

在这里插入图片描述
第一次握手:客户端发送syn报文段;该报文段中不包含任何应用层数据,客户端将SYN置为1,随机产生报文段中第一个字节序列号seq=client_seq,并将该报文段封装到IP数据报中,发送到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn数据报;从该IP数据中提取SYN报文段。服务器将SYN置为1,ACK=1;其次,服务器设置确认号ack=client_seq+1;最后,服务器随机产生自己的初始序列号seq=server_seq,即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK数据报;客户端检查是否ack,ACK;如果正确,则客户端将ACK置为1,确认号ack=server_seq+1;序列号seq=client_seq+1;此时数据连接已经建立完成,将SYN=0;此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP连接都将被一直保持下去。

猜你喜欢

转载自blog.csdn.net/xuan_lu/article/details/106931523