博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TCP三次握手和四次挥手
阅读量:6866 次
发布时间:2019-06-26

本文共 1377 字,大约阅读时间需要 4 分钟。

SYN:1 代表请求创建连接

FIN:1 表示请求关闭连接,在四次分手时,我们发现FIN发了两遍。这是因为TCP的连接是双向的,所以一次FIN只能关闭一个方向。

ACK:代表确认接受,ACK=1,来表示数据接收成功。

seq:序列号,当发送一个数据时,数据是被拆成多个数据包来发送,序列号就是对每个数据包进行编号,这样接受方才能对数据包进行再次拼接。初始序列号是随机生成的。

ack:服务端接收到数据包后进行确认的编号,ack是seq+1,

TCP三次握手和四次挥手

TCP三次握手和四次挥手

在创建连接时,

1.客户端发送syn包(编号seq=x)到服务器,请求创建连接(SYN=1)。

2.服务端接收到后,确认客户请求(ACK=1,ack=x+1),同时自己发送syn包(seq=y)告诉客户端请求创建连接(SYN=1):我接受到请求并处理了,我也想跟你建立连接,你确认下。

3.客户端收到服务器的SYN+ACK包,确认服务端状态(ACK=1,ack=y+1)。同时向服务器发送syn包( seq=x+1)告诉服务端:我接受到你的确认包了,可以开始通讯了。

三次握手完成!

举个打电话的例子:

  A : 你好我是A,你听得到我在说话吗

  B : 听到了,我是B,你听到我在说话吗

  A : 嗯,听到了

  建立连接,开始聊天!

TCP三次握手和四次挥手

在四次分手时,

1.首先客户端请发送一个FIN包(编号seq=u),表示要断开连接(FIN=1)。

2.服务端接收到请求后,确认客户请求(ACK=1,ack=u+1),同时发送数据包(seq=v)告知客户端需要确认当前服务端状态。

3.服务端完成状态确认(ACK=1,ack=u+1),向客户端发送FIN包(seq=w)请求关闭连接(FIN=1)。

4.客户端接收到服务器端请求(ACK=1,ack=w+1),同时发送数据包(seq=u+1)至服务器,告知收到请求并确认。

5.客户端等待两秒,确认服务端收到消息,否则重发一次确认消息。

四次分手完成!

四次挥手:

A:“喂,我不说了。”

B:“我知道了。等下,上一句还没说完。Balabala…..”

B:”好了,说完了,我也不说了。”

A:”我知道了。”

1.为什么连接的时候是三次握手,关闭的时候却是四次握手?

因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

2.如果已经建立了连接,但是客户端突然出现故障了怎么办?

TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75分钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

转载于:https://blog.51cto.com/13689359/2114759

你可能感兴趣的文章
网站前端和后台性能优化32
查看>>
Sco Openserver下 配置SSH服务
查看>>
【WP7进阶】——XNA游戏精灵的动画
查看>>
配置终端服务单一登录
查看>>
接受键盘输入的Linux shell脚本
查看>>
使用VisualStudio2015开发QT项目
查看>>
C#取真实IP地址--多个代理背后的ip地址
查看>>
浅谈Dynamic 关键字系列之四:dynamic为什么比反射快
查看>>
Lambert(朗伯)光照模型 和Half Lambert的区别
查看>>
Microsoft dotnetConf 2015 一些整理
查看>>
python 图
查看>>
Unity应用架构设计(13)——日志组件的实施
查看>>
今天无意中发现的WWW.threadPriority
查看>>
js23---工厂模式1
查看>>
[转] Asp.Net 导出 Excel 数据的9种方案
查看>>
如何在Linux中用命令行工具管理KVM虚拟环境
查看>>
CSS 的优先级机制[总结]
查看>>
保证一个类仅有一个实例:单例模式
查看>>
JVM-ClassLoader装载class的流程
查看>>
redis实现分布式锁——核心 setx+pipe watch监控key变化-事务
查看>>