Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TCP的三次握手和四次挥手 #10

Open
HerryLo opened this issue Aug 17, 2019 · 0 comments
Open

TCP的三次握手和四次挥手 #10

HerryLo opened this issue Aug 17, 2019 · 0 comments
Assignees
Labels
Blog 文章 网络 计算机

Comments

@HerryLo
Copy link
Member

HerryLo commented Aug 17, 2019

原文永久链接:#10

上面有一篇专门介绍过TCP和UCP协议,其中只是粗略的提到TCP协议的三次握手,而四次挥手完全没有说到,所以这次专门总结了这篇文章,专门讲讲三次握手和四次挥手

备注:(下文中提到的专业术语)

ack —— 确认号码

seq —— 顺序号码

ISN —— 初始序列号

ACK —— 确认,使得确认号有效(握手使用)

SYN —— 用于初始化一个连接的序列号,建立联机

FIN —— 该报文的发送方已经结束向对方发送数据

TCP的三次握手

三次握手 实际就是Client端和Server端建立稳定TCP连接的发送三个包的过程

img1

  • 第一次握手:(SYN=1, ACK=0, seq=x):

    Client发送SYN标志位1的包到Server,以及初始序号x(保存在包头的序列号seq字段,简称ISN),和ACK标志位为0,并进入SYN_SEND状态,等待Server确认。

  • 第二次握手:(SYN=1, ACK=1, seq=y, ack=x+1):

    Server发回确认包(ACK)应答。即 SYN 标志位和 ACK 标志位均为1。Server确认ISN序列号,放到seq域里,同时将确认序号(ack)设置为Client的ISN加1,即x+1。 发送完毕后,Server进入 SYN_RCVD 状态。

  • 第三次握手:(ACK=1,seq=x+1,ack=y+1)

    Client再次发送确认包(ACK),ACK标志位为1,并且把Server发来ISN的序号字段+1,放在确定字段中发送给对方。

发送完毕后,Client和Server建立连接,TCP 握手结束。

TCP四次挥手

四次挥手 实际就是Client端和Server端关闭TCP连接的发送四个包的过程

img23

  • 第一次挥手(FIN=1,seq=u)

Client 想要关闭连接,Client 会发送一个FIN标志位置为1,当前序列号为u的包,表示需要关闭连接了。Client进入 FIN_WAIT_1 状态。

  • 第二次挥手(ACK=1,seq=v,ack=u+1)

Server收到Client的FIN包之后,会发送一个确认序号为收到的序列号u+1的包,表明自己接受到了Client关闭连接的请求,但还未准备好关闭连接。Server进入 CLOSE_WAIT 状态,Client进入 FIN_WAIT_2 状态。

  • 第三次挥手(FIN=1,ACK=1,seq=w,ack=u+1)

当Server将剩余数据发送完之后,会发送一个自己的FIN包,序列号为u+1。Server进入 LAST_ACK 状态,等待来自Client的最后一个ACK。

  • 第四次挥手(ACK=1,seq=u+1,ack=w+1)

Client接收到来自Server端的关闭请求之后,发送最后一个ACK确认包,确认序号设置为收到序号加1。Client进入 TIME_WAIT状态,等待可能出现的要求重传的 ACK 包。Server接收到这个确认包之后,关闭连接,进入CLOSED状态。(Client会等待2MSL之后,没有收到Server的ACK ,就确认Server进入CLOSED状态,自己也关闭进入CLOSED状态。)

发送完毕后,Client和Server断开连接,TCP 挥手结束。

以上就是这次挥手和握手的全部内容了,如果有疑问欢迎留言哦。

上一篇:传输层的TCP和UDP协议

参考资料

知乎:“三次握手,四次挥手”你真的懂吗?

bilibili: 计算机网络TCP传输层连接管理

ps: 顺便推一下自己的个人公众号:Yopai,有兴趣的可以关注,每周不定期更新,分享可以增加世界的快乐

@HerryLo HerryLo added the Blog 文章 label Aug 17, 2019
@HerryLo HerryLo self-assigned this Aug 17, 2019
@HerryLo HerryLo added the 网络 计算机 label Sep 27, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Blog 文章 网络 计算机
Projects
None yet
Development

No branches or pull requests

1 participant