TCP状态(选自Windows网络编程技术)

news/2024/5/17 17:28:57 标签: 网络, windows, 编程, tcp, 服务器, c
cle class="baidu_pl">
cle_content" class="article_content clearfix">
content_views" class="htmledit_views">

作为一名Wi n s o c k程序员࿰c;通常没必要了解实际的T C P状态。但了解T C P状态࿰c;就能更好地理解Winsock API调用如何对基层协议中的改变产生影响。此外࿰c;许多程序员在关闭套接字时࿰c;会碰到一个常见问题;围绕套接字关闭的T C P状态是我们目前最感兴趣的问题。

对每个套接字来说࿰c;它的初始状态都是C L O S E D。若客户机初始化了一个连接࿰c;就会向class="tags" href="/tags/FuWuQi.html" title=服务器>服务器发送一个S Y N包࿰c;同时将客户机套接字状态置为S Y N _ S E N T。class="tags" href="/tags/FuWuQi.html" title=服务器>服务器收到S Y N包后࿰c;会发出一个“ S Y N - A C K”包。作为客户机࿰c;需要用一个A C K包对它做出反应。此时࿰c;客户机的套接字会变成E S TA B L I S H E D状态。如果class="tags" href="/tags/FuWuQi.html" title=服务器>服务器一直不发送“ S Y N - A C K”包࿰c;客户机就会超时࿰c;并返回C L O S E D状态。
若一个class="tags" href="/tags/FuWuQi.html" title=服务器>服务器的套接字同一个本地接口和端口绑定起来࿰c;并在它上面进行监听࿰c;那么套接字的状态便是L I S T E N。客户机试图与之连接时࿰c;class="tags" href="/tags/FuWuQi.html" title=服务器>服务器就会收到一个S Y N包࿰c;并用一个S Y N - A C K包做出响应。class="tags" href="/tags/FuWuQi.html" title=服务器>服务器套接字的状态就变成S Y N _ R C V D。最后࿰c;客户机发出一个A C K包࿰c;令class="tags" href="/tags/FuWuQi.html" title=服务器>服务器套接字的状态变成E S TA B L I S H E D。
一旦应用处于E S TA B L I S H E D状态࿰c;可通过两种方法来关闭它。如果由应用程序来关闭࿰c;便叫作“主动套接字关闭”;否则࿰c;套接字的关闭便是被动的。图7 - 2对两种关闭方法进行了解释。如主动关闭࿰c;应用程序便会发出一个F I N包。应用程序调用c l o s e s o c k e t或s h u t d o w n时(把S D _ S E N D当作第二个参数)࿰c;会向对方发出一个F I N包࿰c;而且套接字的状态则变成F I N _ WA I T _ 1。正常情况下࿰c;通信对方会回应一个A C K包࿰c;我们的套接字的状态随之变成F I N _ WA I T _ 2。如对方也关闭了连接࿰c;便会发出一个F I N包࿰c;我们的机器则会响应一个A C K包࿰c;并将己方套接字的状态置为T I M E _ WA I T。

T I M E _ WA I T状态也叫作2 M S L等待状态。其中࿰c; M S L代表“分段最长生存时间”(Maximum Segment Lifetime)࿰c;表示一个数据包在丢弃之前࿰c;可在class="tags" href="/tags/WangLuo.html" title=网络>网络上存在多长时间。每个I P包都含有一个“生存时间”(T T L)字段࿰c;若它递减为0࿰c;包便会被丢弃。一个包经过class="tags" href="/tags/WangLuo.html" title=网络>网络上的每个路由器时࿰c; T T L 值都会减1 ࿰c;然后继续传递。一旦应用程序进入T I M E _ WA I T状态࿰c;那么就会一直持续M S L时间的两倍之久。这样一来࿰c; T C P就可以在最后一个A C K丢失的前提下࿰c;重新发送它࿰c;也就是说࿰c; F I N会被重新传送出去。M S L时间两倍之久的等待状态结束之后࿰c;套接字便进入C L O S E D状态。
采取主动关闭措施时࿰c;有两个路径会进入T I M E _ WA I T状态。在我们以前的讨论中࿰c;只有一方发出一个F I N࿰c;并接收一个A C K响应。然而࿰c;另一方仍然可以自由地发送数据࿰c;直到它也被关闭为止。因此࿰c;需要两个路径发挥作用。在一个路径中(即同步关闭)࿰c;一台计算机和它的通信对方会同时要求关闭;计算机向对方送出一个F I N数据包࿰c;并从它那里接收一个F I N数据包。随后࿰c;计算机会发出一个A C K数据包࿰c;对对方的F I N包做出响应࿰c;并将自己的套接字置为C L O S I N G状态。计算机从对方那里接收到最后一个A C K包之后࿰c;它的套接字状态会变成T I M E _ WA I T。
主动关闭时࿰c;另一个路径其实就是同步关闭的变体:套接字从F I N _ WA I T _ 1状态直接变成T I M E _ WA I T。若应用程序发出一个F I N数据包࿰c;但几乎同时便从对方那里接收到一个F I N - A C K包࿰c;这种情况就会发生。在这种情况下࿰c;对方会确认收到应用程序的F I N包࿰c;并送出自己的F I N包。对于这个包࿰c;应用程序会用一个A C K包做出响应。
T I M E _ WA I T状态的主要作用是在T C P连接处于2 M S L等待状态的时候࿰c;规定用于建立那个连接的一对套接字不可被拒绝。这对套接字由本地I P端口以及远程I P端口组成。对某些T C P实施方案来说࿰c;它们不允许拒绝处于T I M E _ WA I T状态下的套接字对中的任何端口号。在微软的方案中࿰c;不会存在这个问题。然而࿰c;若试图通过一对已处于T I M E _ WA I T状态的套接字建立连接࿰c;就会失败࿰c;并返回W S A E A D D R I N U S E错误。要解决这一问题(除了等待使用那个本地端口来脱离T I M E _ WA I T状态的套接字对)࿰c;一个办法是使用套接字选项S O _ R E F U S E A D D R࿰c;我们将在第9章对这个选项进行详细讨论。

被动关闭情况下࿰c;应用程序会从对方那里接收一个F I N包࿰c;并用一个A C K包做出响应。此时࿰c;应用程序的套接字会变成C L O S E _ WA I T状态。由于对方已关闭自己的套接字࿰c;所以不能再发送数据了。但应用程序却不同࿰c;它能一直发送数据࿰c;直到对方的套接字已关闭为止。要想关闭对方的连接࿰c;应用程序需要发出自己的F I N࿰c;令应用程序的套接字状态变成L A S T _ A C K。应用程序从对方收到一个A C K包后࿰c;它的套接字就会逆转成C L O S E D状态。

cle>

http://www.niftyadmin.cn/n/873556.html

相关文章

关于 List list = new ArrayList(int initialCapacity)

[url]http://wuaner.iteye.com/blog/460412[/url]List list new ArrayList(int initialCapacity); //构造一个初始容量为initialCapacity的空列表。 Sysout.out.println(list.size()); //size()方法指的是List中实际存放有多少个元素,故这里是0 API中对ArrayLi…

条件编译(#ifdef,#else,#endif,#ifndef,#else,#endif)

来自:http://hi.baidu.com/taney/blog/item/1a06abee1763d92a2df534b7.html最近在用C语写一些程序,发现#ifdef,#else,#endif和#ifndef,#else,#endif在UCOS-II中有大量的应用,于是到网上查了一些相关的解释.#ifdef的用法灵活使用#ifdef指示符&…

2023年跨境物流行业研究报告

第一章 行业概况 跨境物流行业是指那些提供将货物从一个国家运输到另一个国家的服务的公司。这些服务可能包括运输、仓储、包装、分拣、清关和货物跟踪等。跨境物流行业是全球贸易的重要组成部分,它使得商品可以从生产地运输到全球各地的消费者手中。 图 物流运输…

php简易开发工具,简单化PHP开发的10个工具

简化PHP开发的10个工具本文介绍了可以帮助简化 PHP 开发的11个项目,包括框架,类库,工具,代码。1. CakePHP Development FrameworkCakePHP 是一个 PHP 的快速开发框架。它提供了可扩展的架构,使用了常见的 MVC 和 ORM 模…

php自增并发处理,高并发网站的自增主键如何防止出现重复情况?

比如说新浪微博的微博id,注册用户的用户uid,百度贴吧的帖子号tid等等我观察过都是按照发布时间呈现递增关系,但是我很好奇这种高并发网站一般都是分布式数据库,数据库之前肯定还有缓存,消息队列等中间件,那…

php搜索ttfb用时太长,waiting TTFB时间过长怎么办

waiting TTFB时间过长的解决办法:首先使用谷歌浏览器开发者工具调到Network;然后在sublime编辑器中die掉所有PHP代码;最后将“hostlocalhost”更改为“host127.0.0.1”即可。waiting(TTFB)时间过长怎么办?本人在学习ajax无刷新分页…

windows CE

Windows CE WindowsCE是微软公司嵌入式、移动计算平台的基础,它是一个开放的、可升级的32位嵌入式操作系统,是基于掌上型电脑类的电子设备操作系统,它是精简的Windows 95,Windows CE的图形用户界面相当出色。 基本简介   其…

JAVA注释方法及格式

[url]http://java.sun.com/j2se/javadoc/index.jsp[/url]1、单行(single-line)--短注释://…… 单独行注释:在代码中单起一行注释, 注释前最好有一行空行,并与其后的代码具有一样的缩进层级。如果单行无法完成,则应采…