程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

TCP的三次握手和四次挥手(TCP的三次握手和四次挥手过程)

balukai 2025-02-03 11:21:22 文章精选 5 ℃

大家好,我是IT售前工程师Bernie。

本文主要介绍计算机网络中数据通信的TCP三次握手和四次挥手。

在正式讲解之前,我们假设有两台主机需要通信,客户机A和B。

三次握手

第1次握手

A发送一个请求连接的数据包给B,数据包包含

  1. IP请求头(网络层, 包含数据的源IP地址和目标IP地址);
  2. TCP头部(传输层, 包含序列码Seq=a、请求标志位SYN = 1和确认码Ack=0)。

注意,这时因为还没建立连接,所以数据包里面是没有实际上要传送的数据的。

第2次握手

当B接收到A的请求连接数据后,也同样发送一个数据包,里面包含

  1. IP请求头(网络层,包含源IP地址和目标IP地址)
  2. TCP请求头(传输层,包含序列码Seq=b,确认码ACK和请求标志位SYN)

注意:

1)确认码是A的数据包确认码+1了,这里的SYN是B的请求标志位。

2)第二次握手主要完成两个目标:目标1是将Ack+1,告诉A “我已经确认了你的请求,我方同意建立连接。” 与此同时,B也发送了一个自己的Ack,目的是请求A的连接确认,同时SYN置位(赋值1)。

第3次握手

当B的请求包到达A时,A看到对方已经同意了自己的请求,可以建立连接。

那么,A还要告诉B:我也同意你的连接请求。于是A将B的Ack+1,序列码也+1,SYN置位,回传给B。

当B接收到回传的消息后,第三次握手也就完成,通道打通,可以发送数据了。

三次握手的目的

第1次A告诉B,我要给你连接,请同意。

第2次B告诉A,我已同意你的连接请求,请确认。另外,也请同意我的连接请求。

第3次A告诉B,我已知道你同意了我的连接请求,另外,我也允许你的连接请求,请知晓。

数据通信

经过三次握手后,双方就建立了稳定的连接,可以自由传输数据了。

双方都会通过 window 字段告诉对方本端最大能够接受的字节数(也就是缓冲区大小)。发送方也会根据接受方宣告的字节数进行数据的接收。

需要注意的是:如果B由于进程占用负荷较大时,可能一次接收不了这么多数据了。那么,它发送数据给A,比如win=1,告诉A“老哥,别一次发这么多了,我只能同时接收一个!” 后面A就会一次发送1个给B。

数据回传时,也会有seq+1,Ack+1的操作,告诉对方已经接收到数据了。

四次挥手

当数据发送告一段落时,就考虑中断连接了,就有了四次挥手的“告别仪式”。

第1次挥手

A发送一个请求连接的数据包给B,告诉B:我请求与你方断开连接。请求数据包含

  1. IP请求头(网络层, 包含数据的源IP地址和目标IP地址);
  2. TCP头部(传输层, 包含序列码Seq=u、结束连接的请求标志位FIN = 1)。

注意,这时因为数据已经传送完了,所以数据包里面是没有实际上要传送的数据的。FIN码就是用来关闭客户到服务器的数据传送的请求码。

第2次挥手

B发送一个确认断开连接的数据请求给A,告诉A:你的断连请求已收到,可以断连。回复信息包含:

  1. IP请求头(网络层, 包含数据的源IP地址和目标IP地址);
  2. TCP头部(传输层, 包含序列码Seq=u+1、结束连接的确认码ACK=1,FIN = 1)。

注意,服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。

第3次挥手

B发送一个请求连接的数据包给A,告诉A:我请求与你方断开连接。请求数据包含

  1. IP请求头(网络层, 包含数据的源IP地址和目标IP地址);
  2. TCP头部(传输层, 包含序列码Seq=w、结束连接的请求标志位FIN = 1)。

注意,FIN码就是用来关闭客户到服务器的数据传送的请求码。

第4次挥手

A发送一个确认断开连接的数据请求给B,告诉B:你的断连请求已收到,可以断连。回复信息包含:

  1. IP请求头(网络层, 包含数据的源IP地址和目标IP地址);
  2. TCP头部(传输层, 包含序列码Seq=w+1、结束连接的确认码ACK=1,FIN = 1)。

注意,服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。

四次挥手的目的

第1次挥手:A告诉B,数据传输完毕,我方要求与你断开连接,请确认。

第2次挥手:B告诉A,我已同意你的断连请求,请知悉。

第3次挥手:B告诉A,我方也要求与你断开连接,请确认。

第4次挥手:A告诉B,同意!

Tags:

最近发表
标签列表