TCP连接状态具体解释
tcp状态:
LISTEN:侦听来自远方的TCPport的连接请求
SYN-SENT:再发送连接请求后等待匹配的连接请求 SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认 ESTABLISHED:代表一个打开的连接 FIN-WAIT-1:等待远程TCP连接中断请求,或先前的连接中断请求的确认 FIN-WAIT-2:从远程TCP等待连接中断请求 CLOSE-WAIT:等待从本地用户发来的连接中断请求 CLOSING:等待远程TCP对连接中断的确认 LAST-ACK:等待原来的发向远程TCP的连接中断请求的确认 TIME-WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认 CLOSED:没有不论什么连接状态 ![]() ![]() ![]() ![]() ![]() TCP是一个面向连接的协议,所以在连接两方发送数据之前,都须要首先建立一条连接。这和前面讲到的协议全然不同。前面讲的全部协议都仅仅是发送数据而已,大多数都不关心发送的数据是不是送到,UDP尤其明显,从编程的角度来说,UDP编程也要简单的多----UDP都不用考虑数据分片。 书中用telnet登陆退出来解释TCP协议连接的建立和中止的过程,能够看到,TCP连接的建立能够简单的称为三次握手,而连接的中止则能够叫做四次握手。 1.连接的建立在建立连接的时候,client首先向server申请打开某一个port(用SYN段等于1的TCP报文),然后server端发回一个ACK报文通知client请求报文收到,client收到确认报文以后再次发出确认报文确认刚才server端发出的确认报文(绕口么),至此,连接的建立完毕。这就叫做三次握手。假设打算让两方都做好准备的话,一定要发送三次报文,并且仅仅须要三次报文就能够了。 能够想见,假设再加上TCP的超时重传机制,那么TCP就全然能够保证一个数据包被送到目的地。 2.结束连接TCP有一个特别的概念叫做half-close,这个概念是说,TCP的连接是全双工(能够同一时候发送和接收)连接,因此在关闭连接的时候,必须关闭传和送两个方向上的连接。客户机给server一个FIN为1的TCP报文,然后server返回给client一个确认ACK报文,而且发送一个FIN报文,当客户机回复ACK报文后(四次握手),连接就结束了。 3.最大报文长度在建立连接的时候,通信的两方要互相确认对方的最大报文长度(MSS),以便通信。一般这个SYN长度是MTU减去固定IP首部和TCP首部长度。对于一个以太网,一般能够达到1460字节。当然假设对于非本地的IP,这个MSS可能就仅仅有536字节,并且,假设中间的传输网络的MSS更佳的小的话,这个值还会变得更小。 4.TCP的状态迁移图书P182页给出了TCP的状态图,这是一个看起来比較复杂的状态迁移图,由于它包括了两个部分---server的状态迁移和client的状态迁移,假设从某一个角度出发来看这个图,就会清晰很多,这里面的server和client都不是绝对的,发送数据的就是client,接受数据的就是server。 4.1.client应用程序的状态迁移图client的状态能够用例如以下的流程来表示: CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED 以上流程是在程序正常的情况下应该有的流程,从书中的图中能够看到,在建立连接时,当client收到SYN报文的ACK以后,client就打开了数据交互地连接。而结束连接则一般是client主动结束的,client结束应用程序以后,须要经历FIN_WAIT_1,FIN_WAIT_2等状态,这些状态的迁移就是前面提到的结束连接的四次握手。 4.2.server的状态迁移图server的状态能够用例如以下的流程来表示: CLOSED->LISTEN->SYN收到->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED 在建立连接的时候,server端是在第三次握手之后才进入数据交互状态,而关闭连接则是在关闭连接的第二次握手以后(注意不是第四次)。而关闭以后还要等待client给出最后的ACK包才干进入初始的状态。 4.3.其它状态迁移书中的图另一些其它的状态迁移,这些状态迁移针对server和client双方面的总结例如以下
4.4.2MSL等待状态书中给的图里面,有一个TIME_WAIT等待状态,这个状态又叫做2MSL状态,说的是在TIME_WAIT2发送了最后一个ACK数据报以后,要进入TIME_WAIT状态,这个状态是防止最后一次握手的数据报没有传送到对方那里而准备的(注意这不是四次握手,这是第四次握手的保险状态)。这个状态在非常大程度上保证了两方都能够正常结束,可是,问题也来了。 因为插口的2MSL状态(插口是IP和port对的意思,socket),使得应用程序在2MSL时间内是无法再次使用同一个插口的,对于客户程序还好一些,可是对于服务程序,比如httpd,它总是要使用同一个port来进行服务,而在2MSL时间内,启动httpd就会出现错误(插口被使用)。为了避免这个错误,server给出了一个平静时间的概念,这是说在2MSL时间内,尽管能够又一次启动server,可是这个server还是要平静的等待2MSL时间的过去才干进行下一次连接。 4.5.FIN_WAIT_2状态这就是著名的半关闭的状态了,这是在关闭连接时,client和server两次握手之后的状态。在这个状态下,应用程序还有接受数据的能力,可是已经无法发送数据,可是也有一种可能是,client一直处于FIN_WAIT_2状态,而server则一直处于WAIT_CLOSE状态,而直到应用层来决定关闭这个状态。 5.RST,同一时候打开和同一时候关闭RST是还有一种关闭连接的方式,应用程序应该能够推断RST包的真实性,即是否为异常中止。而同一时候打开和同一时候关闭则是两种特殊的TCP状态,发生的概率非常小。 6.TCPserver设计前面以前讲述过UDP的server设计,能够发现UDP的server全然不须要所谓的并发机制,它仅仅要建立一个数据输入队列就能够。可是TCP不同,TCPserver对于每个连接都须要建立一个独立的进程(或者是轻量级的,线程),来保证对话的独立性。所以TCPserver是并发的。并且TCP还须要配备一个呼入连接请求队列(UDPserver也相同不须要),来为每个连接请求建立对话进程,这也就是为什么各种TCPserver都有一个最大连接数的原因。而依据源主机的IP和port号码,server能够非常轻松的差别出不同的会话,来进行数据的分发。 |
TCP连接状态具体解释的更多相关文章
- 关于TCP连接状态的解释
TCP各个状态主要存在于三次握手和四次挥手的过程 1.TCP建立连接时的三次握手: 服务端应用监听端口处于LISTEN状态,等待建立连接. 第一次握手:客户端发送SYN=一个随机数,然后进入SYN_S ...
- 查看 Apache并发请求数及其TCP连接状态
查看 Apache并发请求数及其TCP连接状态 (2011-06-27 15:08:36) 服务器上的一些统计数据: 1)统计80端口连接数 netstat -nat|grep -i "80 ...
- 查看 并发请求数及其TCP连接状态【转】
服务器上的一些统计数据: 1)统计80端口连接数netstat -nat|grep -i "80"|wc -l 2)统计httpd协议连接数ps -ef|grep httpd|wc ...
- Linux下查看Web服务器当前的并发连接数和TCP连接状态
对于web服务器(Nginx.Apache等)来说,并发连接数是一个比较重要的参数,下面就通过netstat命令和awk来查看web服务器的并发连接数以及TCP连接状态. $ netstat -n | ...
- 查看 并发请求数及其TCP连接状态
服务器上的一些统计数据: 1)统计80端口连接数netstat -nat|grep -i "80"|wc -l 2)统计httpd协议连接数ps -ef|grep httpd|wc ...
- TCP连接状态
TCP 连接状态按 TCP 协议的标准表示法, TCP 可具有如下几种状态,为讨论方便,如下讨论中区分服务端和客户端,实际软件处理上对二者一视同仁. CLOSED关闭状态.在两个通信端使用“三路握手” ...
- 查看 Apache并发请求数及其TCP连接状态【转】
查看 Apache并发请求数及其TCP连接状态 (2011-06-27 15:08:36) 服务器上的一些统计数据: 1)统计80端口连接数netstat -nat|grep -i "80& ...
- TCP三次握手及TCP连接状态 TCP报文首部格式
建立TCP连接时的TCP三次握手和断开TCP连接时的4次挥手整体过程如下图: 开个玩笑 ACK: TCP协议规定,只有ACK=1时有效,连接建立后所有发送的报文ACK必须为1 SYN(SYNchron ...
- zabbix监控 linux/windows 主机tcp连接状态
更新内容:1).增加了对windows主机的tcp连接状态的监控2).修改linux主机的监控配置,使linux与windwos主机能够使用相同的模板tcp的连接状态对于监控服务器,尤其是Web服务器 ...
随机推荐
- HTML解决div里面img的缝隙问题
图片IMG与容器下边界之间有空隙怎么办?这里介绍3中简单的解决方法. 第一,给图片img标签display:block. img{display:block} 第二,定义容器里的字体大小为0. div ...
- Kali Rolling在虚拟机安装后的设置
Kali Linux在2016年的第一个发行版——Kali Rolling是Debian的即时更新版,只要Debian中有更新,更新包就会放入Kali Rolling中,供用户下载使用.它为用户提供了 ...
- php基本框架
- Protel对话窗字体显示不完全问题解决办法(PCB)
点击protel99左上角的大箭头,点击preferences ,在对话框中把use client system fonts for all dialogs 复选框去掉,就可以了.
- 「JAVA」:Berkeley DB的JAVA连接
Berkeley DB是一个嵌入式的数据库,它适合于管理海量的.简单的数据.关键字/数据(key/value)是Berkeley DB用来进行数据管理的基础.每个key/value构成了一条记录,而整 ...
- cocos2d-x游戏开发系列教程-超级玛丽08-消息机制
在超级玛丽游戏里,地图类CMGameMap负责所有的程序逻辑,它包含了背景地图,包含了游戏元素精灵,当游戏中的精灵之间发生碰撞时,比如马里奥撞上砖头这种事情发生时,马里奥对象本身不知道怎么处理这个逻辑 ...
- 使用msys
下载地址:http://msys2.github.io/ 更新:pacman -Syu 安装git:pacman -S git 或者使用cygwin 调色:编辑~/.minttyrc Foregrou ...
- Cocos2d-x 创建自己定义项目模板
你是否以前为cocos方便高速开发而兴奋,你是否以前为各种工具的便利开发而感动,但如今的你是否为每次创建一个新的项目都是HelloWorldScene而苦恼? 好吧,事实上我也感觉到了,每次创建一个项 ...
- java面向对象中的String类中12种常用的方法
1.字符串与字符数组的转换 字符串可以使用toCharArray()方法变成一个字符数组,也可以使用String类的构造方法把一个字符数组变成一个字符串. public class StringAPI ...
- [转]如何申请和管理一个sourceforge项目
假如你没有贡献免费源代码的想法,就不用继续读本文了.:) 如果读者的e文不错,作者建议你直接阅读sourceforge的 howto文档,他们整理得非常周到详实.本文只是作者的使用经验,也许可以给与作 ...