TCP的3次握手和4次挥手
三次握手
第一次握手
客户端向服务端发送一个TCP报文,报文的头部信息:
SYN=1 SYN(sync)标志位表示同步,表示想向服务端建立连接
seq 序列号(Sequence number)的意思,是一个可以装载数值的地方,我们给它设置为随机数,是用来做凭证(token)的,稍后服务端会使用它
第二次握手
服务端向客户端发送一个TCP报文(服务端针对客户端的消息做回应),TCP报文头部:
ACK 标志位设置为 1,表示已知悉(acknowledge)客户端的连接请求;
ack ack 的值设置为客户端传过来的 seq 值 + 1(即 x+1);
SYN 标志位设置为 1,表示服务端也要连接;
seq 设置一个随机数(假设随机数为 y);
注:
服务端通过 ACK 和 ack 来告知客户端已知悉连接请求,并发送自己的 SYN 和 seq 来请求和客户端的连接。
第三次握手
客户端收到服务端的消息后确认ACK是否为1,ack是否为x+1,如果是,说明服务端的这个发送是对应第一次握手的返回。
客户端向服务端发送TCP消息(客户端对服务端建立连接的回应)
ACK 设置为1
ack 设置为服务端 ack 的值 + 1(即 y + 1)
四次挥手
第一次挥手
客户端向服务端发送断开连接TCP请求,TCP头部信息
FIN 设置为1
seq 设置为随机数x
FIN 是一个标志位,表示结束(finish)的意思,1 等同于 true;
seq 是个序列号,一个装数据的地方,我们这里给他设置为一个随机数,用于给服务端做确认,好对应上这个 TCP 请求;
第二次挥手
服务端向客户端发送TCP请求(服务端对客户端的请求做出回应)TCP头部信息
ACK 设置为 1(acknowledge,表示 “收到” 的意思)
ack 确认号设置为 x+1(x 来自第一次挥手)
此时,客户端到服务端的连接通道关闭,客户端不能正常向服务端发送请求,此时服务端到客户端还是可以发送数据的,如果服务端有一些之前的 TCP 请求没来得及响应,在第二次挥手和第三次挥手期间还是可以去返回的。
(服务端会在第三次挥手之前将之前客户端发出未响应的TCP请求处理完成)
第三次挥手
服务端向客户端发送 TCP 请求(请求断开服务端到客户端的通道)
FIN 设置为1
seq 设置一个随机数y
第四次挥手
客户端向服务端发送TCP请求
ACK 设置为 1
ack 确认号设置为 y+1
注:第四次挥手时,客户端会等待2MSL长的时间才释放,因为当服务端没后收到客户端第四次挥手信息时就会重新向客户端发起第三次挥手报文,报文一来一回的时间为2MSL
(MSL是Maximum Segment Lifetime的缩写,译为报文最大生存时间,也就是任何报文在网络上存活的最大时间,一旦超过该时间,报文就会被丢弃,2MSL为报文最长寿命的2倍)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
2020-10-10 Angular2 No value accessor for form control with unspecified name attribute
2020-10-10 三元表达式 ?.等运算