TCP连接管理与释放
作者:追风剑情 发布于:2024-11-20 21:04 分类:其他
TCP是面向连接的传输层协议。在每一次数据传输之前首先要在通信双方建立一条连接,即在源进程和目的进程之间建立一条虚路径。属于同一个报文的所有报文段都通过这条虚路径传输,数据传输完成后释放连接。在TCP中面向连接的传输是通过两个过程来完成的:建立连接和释放连接。连接管理就是使连接的建立和释放都能正常进行。
TCP连接的建立和释放都是采用客户-服务器模式。主动发起连接建立的进程称为客户进程,而另一个被动等待连接建立的进程被称为服务器进程。
建立连接
TCP以全双工方式传送数据。在任何数据传送之前,要使每一方能确知对方的存在。双方都必须对通信进行初始化,并得到对方的认可。当两个TCP建立连接后,它们就能够同时互相发送报文段。
TCP中建立连接采用3次握手(Three-Way Handshake)的方式实现。建立连接的过程从服务器开始。服务器进程先发出一个被动打开的命令,告诉它的TCP它已准备好接受客户进程连接请求,即被动的等待握手。客户应用进程发出主动打开命令,表明要与一个服务器应用进程使用传输层协议中的TCP建立传输连接,即发出建立连接请求。TCP建立连接3次握手的过程如图 8-6 所示。
3次握手的步骤如下:
1)客户端发送第一个报文段,即SYN报文段。SYN报文段指明这个客户打算连接的服务器的端口,以及客户初始序号,ISN(假设x=1200),用来对从客户端发送到服务器端的数据字节 进行编号,表明当从客户端向服务器端发送数据时第一个数据字节的序号就是1200。若客户打算在这个报文段中增加相应的选项,就可在此进行定义。如定义从服务器接收的 MSS。
这个SYN报文段为报文段1。报文段1把同步位SYN标志置1,确认位ACK标志置为0,定义这个客户端打算建立一条具有某些参数的连接的愿望。
2)如果服务器端同意接受连接,则发回报文段2.即使用SYN位和ACK位作为应答来回应客户端这个建立连接的请求。它将客户端的初始序号加1(即ACK=x+1=1201)以对客户的SYN报文段进行确认。同时,选择服务器端的初始序号(假设y=4800),用来对从服务器端发送到客户端的数据字节进行编号,那么从服务器端向客户端发送数据时第一个数据字节的序号是4800。如果需要的话,可在报文段中增加相应的选项,如服务器端所定义的MSS(定义从客户端接收的MSS)。
报文段2中确认位ACK标志为1,同步位SYN标志为1,所以也称这个报文段2为SYN+ACK报文段。
一个 SYN 将占用一个序号。
3)最后,客户端发送报文段3。这是一个确认报文段。它使用ACK标志和确认号字段来确认收到了报文段2。确认号字段为服务器的初始序号加1(即y+1=4801)以对服务器端的SYN报文段进行确认。
运行客户进程的主机A的TCP通知其上层应用进程连接已建立;运行服务器进程的主机B在收到这个确认之后,表示连接建立,也通知其上层应用进程。这时就可以开始发送和接收数据了。
在报文段3中把确认位ACK标志置为1,同步位SYN标志置为0。这仅仅是一个ACK报文段。
这3个报文段的交换过程,即3次握手过程完成了TCP连接的建立。
在TCP连接的建立过程中,发送第1个SYN的一端将执行主动打开,接收这个SYN并发回下一个SYN的另一端执行被动打开。
如果两个主机同时都发出主动打开,企图在相同的两个套接字之间建立一条连接则发生连接请求碰撞,如图 8-7 所示。
在这种情况下,两个TCP都向对方发送SYN+ACK报文段,然后在这两方之间建立一条连接。即这个时候仅有一条连接建立起来,而不是两条连接。因为所有的连接都是由它们的端点来惟一标识的。
连接释放
在数据传输结束后,通信的双方都可以发出释放连接的请求。
一个TCP连接是全双工的(即数据在两个方向上能同时传递),因此每个方向必须单独地进行关闭。原则就是当一方没有数据发送后就发送一个终止位FIN来终止这个方向的连接。TCP连接的释放是通过通信的两方都发送一个FIN标志为1的TCP报文段来实现的。当一个FIN报文段被确认后,那个方向的连接就被关闭。也就是说收到一个FIN只意味着在这一方向上没有数据传送了,但它仍然可以继续接收对方发来的数据。只有当两个方向的连接都被关闭后,该TCP连接才被完全释放。所以要释放一个连接需要4个TCP报文段的交互,称为4次握手,如图8-8所示。
TCP连接释放4次握手的步骤如下:
1)首先进行关闭的客户端TCP发送第一个报文段(报文段1),即FIN报文段,终止位FIN标志置1。执行主动关闭,不再发送数据。设报文段1中的序号SEQ=x=2500。
2)服务器端TCP发送第二个报文段(报文段2),即ACK报文段,用来确认从客户发来的FIN报文段。这个确认号等于收到的FIN报文段中的序号加1,即ACK=2501,并设其序号SEQ=y=7000。
3)服务器端TCP可以继续在从服务器端到客户端的方向上发送数据,当服务器端没有数据发送时,它就发送第三个报文段(报文段3),即 FIN 报文段,终止位 FIN 标志置1。关闭从服务器到客户的数据传送。报文段3的SEQ=y+1=7001、ACK=x+1=2501。
4)客户端TCP发送第4个报文段(报文段4),即 ACK 报文段,用来确认从服务器端TCP收到了 FIN 报文段。这个确认号等于从服务器收到的 FIN报文段的序号加1,即 ACK=7002、SEQ=x+1=2501。
至此,整个连接已经全部释放。
一个 FIN 将占用一个序号。
一个TCP连接的两端,也可能会同时发送FIN报文段,都执行主动关闭。TCP允许这样的同时关闭。这两个报文段按常规的方法被确认,然后连接被释放。这和两台主机按顺序先后释放连接没有本质区别。
TCP连接通常是由客户端发起的。这样,第一个SYN从客户端传到服务器端。然而,一个TCP连接的每一端都能主动关闭这个连接,即都能首先发送FIN。一般情况下是客户应用进程打算终止连接(但不总是),因为客户应用进程通常由用户控制。
连接复位
TCP首部中的RST位是用于复位的。当TCP需要复位连接时则使用RST报文段。
TCP可以请求把一个连接复位。连接复位表示当前的连接已经被撤销。以下是发生复位的3种情况:
1)一端的TCP请求连接到并不存在的端口,另一端的TCP就可以发送一个复位报文段,其复位位RST置1,来取消这个请求。
2)一端的TCP出现了异常情况,而愿意把连接异常终止。它就可以发送复位报文段,其复位位RST置1,来关闭这一连接。
3)一端的TCP可能发现在另一端的TCP已经空闲了很长的时间,则它可以把这个连接撤销。它就可以发送复位报文段,其复位位RST置1,来撤销这个连接。
复位报文段不会导致另一端产生任何响应,另一端也不需进行确认。收到RST的一方将终止这个连接,并通知应用层连接复位。连接复位是一种立即的异常终止,这意味着在两个方向的数据传输都立即停止。
日历
最新文章
随机文章
热门文章
分类
存档
- 2024年11月(3)
- 2024年10月(5)
- 2024年9月(3)
- 2024年8月(3)
- 2024年7月(11)
- 2024年6月(3)
- 2024年5月(9)
- 2024年4月(10)
- 2024年3月(11)
- 2024年2月(24)
- 2024年1月(12)
- 2023年12月(3)
- 2023年11月(9)
- 2023年10月(7)
- 2023年9月(2)
- 2023年8月(7)
- 2023年7月(9)
- 2023年6月(6)
- 2023年5月(7)
- 2023年4月(11)
- 2023年3月(6)
- 2023年2月(11)
- 2023年1月(8)
- 2022年12月(2)
- 2022年11月(4)
- 2022年10月(10)
- 2022年9月(2)
- 2022年8月(13)
- 2022年7月(7)
- 2022年6月(11)
- 2022年5月(18)
- 2022年4月(29)
- 2022年3月(5)
- 2022年2月(6)
- 2022年1月(8)
- 2021年12月(5)
- 2021年11月(3)
- 2021年10月(4)
- 2021年9月(9)
- 2021年8月(14)
- 2021年7月(8)
- 2021年6月(5)
- 2021年5月(2)
- 2021年4月(3)
- 2021年3月(7)
- 2021年2月(2)
- 2021年1月(8)
- 2020年12月(7)
- 2020年11月(2)
- 2020年10月(6)
- 2020年9月(9)
- 2020年8月(10)
- 2020年7月(9)
- 2020年6月(18)
- 2020年5月(4)
- 2020年4月(25)
- 2020年3月(38)
- 2020年1月(21)
- 2019年12月(13)
- 2019年11月(29)
- 2019年10月(44)
- 2019年9月(17)
- 2019年8月(18)
- 2019年7月(25)
- 2019年6月(25)
- 2019年5月(17)
- 2019年4月(10)
- 2019年3月(36)
- 2019年2月(35)
- 2019年1月(28)
- 2018年12月(30)
- 2018年11月(22)
- 2018年10月(4)
- 2018年9月(7)
- 2018年8月(13)
- 2018年7月(13)
- 2018年6月(6)
- 2018年5月(5)
- 2018年4月(13)
- 2018年3月(5)
- 2018年2月(3)
- 2018年1月(8)
- 2017年12月(35)
- 2017年11月(17)
- 2017年10月(16)
- 2017年9月(17)
- 2017年8月(20)
- 2017年7月(34)
- 2017年6月(17)
- 2017年5月(15)
- 2017年4月(32)
- 2017年3月(8)
- 2017年2月(2)
- 2017年1月(5)
- 2016年12月(14)
- 2016年11月(26)
- 2016年10月(12)
- 2016年9月(25)
- 2016年8月(32)
- 2016年7月(14)
- 2016年6月(21)
- 2016年5月(17)
- 2016年4月(13)
- 2016年3月(8)
- 2016年2月(8)
- 2016年1月(18)
- 2015年12月(13)
- 2015年11月(15)
- 2015年10月(12)
- 2015年9月(18)
- 2015年8月(21)
- 2015年7月(35)
- 2015年6月(13)
- 2015年5月(9)
- 2015年4月(4)
- 2015年3月(5)
- 2015年2月(4)
- 2015年1月(13)
- 2014年12月(7)
- 2014年11月(5)
- 2014年10月(4)
- 2014年9月(8)
- 2014年8月(16)
- 2014年7月(26)
- 2014年6月(22)
- 2014年5月(28)
- 2014年4月(15)
友情链接
- Unity官网
- Unity圣典
- Unity在线手册
- Unity中文手册(圣典)
- Unity官方中文论坛
- Unity游戏蛮牛用户文档
- Unity下载存档
- Unity引擎源码下载
- Unity服务
- Unity Ads
- wiki.unity3d
- Visual Studio Code官网
- SenseAR开发文档
- MSDN
- C# 参考
- C# 编程指南
- .NET Framework类库
- .NET 文档
- .NET 开发
- WPF官方文档
- uLua
- xLua
- SharpZipLib
- Protobuf-net
- Protobuf.js
- OpenSSL
- OPEN CASCADE
- JSON
- MessagePack
- C在线工具
- 游戏蛮牛
- GreenVPN
- 聚合数据
- 热云
- 融云
- 腾讯云
- 腾讯开放平台
- 腾讯游戏服务
- 腾讯游戏开发者平台
- 腾讯课堂
- 微信开放平台
- 腾讯实时音视频
- 腾讯即时通信IM
- 微信公众平台技术文档
- 白鹭引擎官网
- 白鹭引擎开放平台
- 白鹭引擎开发文档
- FairyGUI编辑器
- PureMVC-TypeScript
- 讯飞开放平台
- 亲加通讯云
- Cygwin
- Mono开发者联盟
- Scut游戏服务器引擎
- KBEngine游戏服务器引擎
- Photon游戏服务器引擎
- 码云
- SharpSvn
- 腾讯bugly
- 4399原创平台
- 开源中国
- Firebase
- Firebase-Admob-Unity
- google-services-unity
- Firebase SDK for Unity
- Google-Firebase-SDK
- AppsFlyer SDK
- android-repository
- CQASO
- Facebook开发者平台
- gradle下载
- GradleBuildTool下载
- Android Developers
- Google中国开发者
- AndroidDevTools
- Android社区
- Android开发工具
- Google Play Games Services
- Google商店
- Google APIs for Android
- 金钱豹VPN
- TouchSense SDK
- MakeHuman
- Online RSA Key Converter
- Windows UWP应用
- Visual Studio For Unity
- Open CASCADE Technology
- 慕课网
- 阿里云服务器ECS
- 在线免费文字转语音系统
- AI Studio
- 网云穿
- 百度网盘开放平台
- 迅捷画图
- 菜鸟工具
- [CSDN] 程序员研修院
- 华为人脸识别
- 百度AR导航导览SDK
- 海康威视官网
- 海康开放平台
- 海康SDK下载
- git download
交流QQ群
-
Flash游戏设计: 86184192
Unity游戏设计: 171855449
游戏设计订阅号