博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
计网——TCP连接管理(三次握手、四次握手)
阅读量:7063 次
发布时间:2019-06-28

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

hot3.png

TCP连接管理分为两部分:一是三次握手建立连接;二是四次握手释放连接

1.连接建立(三次握手)

18150427_rJi2.png

①主机A的TCP向服务器B的TCP发出连接请求报文段,其首部中的同步比特标志位SYN应置为1,同时选择一个初始序号seq=x;

②服务器B的TCP收到连接请求报文后,则发回确认,标志位ACK应置为1,确认号应为ack=x+1.因为连接是双向的,所以服务器B也发出和A的连结请求,在报文段中同时应将SYN置为1,为自己选择一个初始序列seq=y。

③主机A的TCP收到此报文段后,还要向服务器B给出确认,ACK应置为1,其确认号为ack=y+1。

:①SYN:在连接建立是用来同步序号;ACK表明确认号字段有效;FIN用来释放一个连接。

      ②TCP报文段首部的SYN和FIN置位的时候,需要消耗一个序列号(所有才有x+1和y+1),而仅有ACK置位时,不需要消耗序列号。

      ③二次握手会导致死锁。假如使用二次死锁,即A不会再向B发送确认报文,如果第二次握手中B给A的确认报文丢失的话,那么B认为已经连接,会开始给A发送数据报文,A会丢弃B传来的数据报文并继续等待B发送确认报文,而B也会因为发送超时再次重复发送同样的报文,导致死锁。

2.连接释放(四次握手)

215254_cVNh_3786691.png

①主机A的TCP通知对方要释放从主机A吊服务器B这个方向的连接,将发往主机B的TCP报文段首部终止比特标志位FIN置1,假定此时序号为seq=m。

②服务器B的TCP收到释放连接的通知后,即发出确认,FIN需要消耗一个序号,所以其确认号为ack=m+1。这样从主机A到服务器B的连接就释放了,连接处于半关闭状态。此时如果服务器B还发送数据,主机A仍接收。

③服务器B向主机A的数据发送后,TCP释放服务器B到主机A的连接。服务器B发送出的连接释放报文除必须将终止比特FIN置1,并假定其序号seq=n,因为标志位ACK不需要消耗序号,所以此时的确认号仍然是ack=m+1。

④主机A必须对此发出确认,因为FIN需要消耗一个序号,所以给出确认号为ack=n+1。最终双方连接释放全部完成。

 

总结:总体来看TCP的连接和释放其实本质相同,都是一个双方都需要发送连接(释放)请求,然后再发回确认的过程。区别在于连接时没有前置条件,所以B给A的确认和请求可以同时发送;而释放时,存在一个前置条件,就是数据发送结束,不能保证B给A发送确认的同时也能够发送申请(即B向A的数据发送已经结束),所以释放过程比连接过程多了一次握手。

 

转载于:https://my.oschina.net/u/3786691/blog/1630683

你可能感兴趣的文章
sleep()和wait()有什么区别?
查看>>
读取XML文件
查看>>
三、Python-列表
查看>>
查找字符串中出现最多的字符
查看>>
设置c++程序的堆栈空间解决栈溢出问题
查看>>
新手须知 C、C++和VC++之间的区别
查看>>
初学者比较容易犯的布局错误(手风琴布局)
查看>>
【Mybatis】 Mybatis在xml文件中处理大于号小于号的方法【问题】
查看>>
软件开发中的完整测试所包括的环节UT、IT、ST、UAT
查看>>
【Unity Shaders】《Unity Shaders and Effects Cookbook》总结篇
查看>>
POJ2456(最大化最小值)解题报告
查看>>
.net 提取注释生成API文档 帮助文档
查看>>
SqlTest(2013-07-10)
查看>>
冒泡排序法与二分查找法
查看>>
TAO服务的Notify服务启动失败问题
查看>>
定时器
查看>>
第一个微信项目
查看>>
关于C#中随机数的生成问题
查看>>
angular 1.2.29版本下 动态添加多个表单、 校验全部、 提交 、ng-form方案
查看>>
理解PHP中会话控制
查看>>