前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >三次握手与四次挥手

三次握手与四次挥手

作者头像
一个架构师
发布2022-06-27 15:12:29
2230
发布2022-06-27 15:12:29
举报

又到了一年一度的黄金3月了,作为网络的必问内容, 有必要好好回忆下了.

1

TCP报文格式

其中比较重要的字段有:

(1)序号(sequence number): Seq序号, 占32位, 用来标识从TCP源端向目的端发送的字节流, 发起方发送数据时对此进行标记.

(2)确认号(acknowledgement number): Ack序号, 占32位, 只有ACK标志位为1时, 确认序号字段才有效, Ack=Seq+1.

(3)标志位(Flags): 共6个, 即URG、ACK、PSH、RST、SYN、FIN等. 具体含义如下:

URG: 紧急指针(urgent pointer)有效.

ACK: 确认序号有效.

PSH: 接收方应该尽快将这个报文交给应用层.

RST: 重置连接.

SYN: 发起一个新连接.

FIN: 释放一个连接.

需要注意的是:

不要将确认序号Ack与标志位中的ACK搞混了. 确认方Ack=发起方Seq+1, 两端配对.

2

三次握手

(1)第一次握手: Client将标志位SYN置为1, 随机产生一个值seq=x, 并将该数据包发送给Server, Client进入SYN_SENT状态, 等待Server确认.

(2)第二次握手: Server收到数据包后由标志位SYN=1知道Client请求建立连接, Server将标志位SYN和ACK都置为1, ack=x+1, 随机产生一个值seq=y, 并将该数据包发送给Client以确认连接请求, Server进入SYN_RCVD状态.

(3)第三次握手: Client收到确认后, 检查ack是否为x+1, ACK是否为1, 如果正确则将标志位ACK置为1, ack=y+1, 并将该数据包发送给Server, Server检查ack是否为y+1, ACK是否为1, 如果正确则连接建立成功, Client和Server进入ESTABLISHED状态, 完成三次握手, 随后Client与Server之间可以开始传输数据了.

3

四次挥手

(1)第一次挥手: Client发送一个FIN, 用来关闭Client到Server的数据传送, Client进入FIN_WAIT_1状态 .

(2)第二次挥手: Server收到FIN后 , 发送一个ACK给Client, 确认序号为收到序号+1(与SYN相同, 一个FIN占用一个序号), Server进入CLOSE_WAIT状态 .

(3)第三次挥手: Server发送一个FIN, 用来关闭Server到Client的数据传送, Server进入LAST_ACK状态.

(4)第四次挥手: Client收到FIN后, Client进入TIME_WAIT状态, 时间是2MSL(最大分段生存期, 默认2分钟), 接着发送一个ACK给Server, 确认序号为收到序号+1 , Server进入CLOSED状态, 完成四次挥手.

小结

记住这些, 你的网络问答可以拿60分了

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 从码农的全世界路过 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档