Linux 网络编程 之 TCP状态转换

                                               Linux 网络编程 之 TCP状态装换

 

 

 

                             

 

                             

 

从上面的图中可以看出,TCP共有11状态.由TCP发送和接收的数据有:ACK, FIN, SYN,RST.对于一个还未调用connect的client和未调用listen的server来说,它们都处于CLOSED状态.ACK是应答信息,任何一端(client或者server),在接收到数据(这里的数据包括应用程序write或者TCP发出的信息比如FIN)之后,都会发出的应答信息.FIN是close一个socket后由TCP发出的信息,SYN是握手信息.RST信息,则是client向server发送数据请求,但是server并没有运行.则client会收到来自对方主机发送的RST信息.

客户端调用connect,会向server发送SYN信息,此时client状态有CLOSED转变成SYN_SENT状态.而server在调用listen之后,会由CLOSED状态转变成LISTEN状态,此时,server就会一直监听server的端口,接收来自client的信息.在server接收到来自client的SYN信号后,会向client发出一个SYN和ACK信息,此时,server由LISTEN状态转变成SYN_RCVD状态.client接收到server的SYN和ACK信息之后,会向server回复一个ACK信息,到此为止,client和server之间就建立起连接了.client和server的状态都变成ESTABLISHED状态.

在这11个状态中,除了ESTABLISHED外,还有2个比较重要的状态:CLOSED_WAIT和TIME_WAIT.CLOSE_WAIT状态时有对方主动调用close,向本地(这里本地,并不一定说的是client)发送FIN,本地接收到FIN,并向对方发送ACK之后,本地状态会变成CLOSE_WAIT状态.那么,本地如果需要从CLOSE_WAIT状态变成CLOSED状态,需要本地向对方发送FIN,也就是需要本地主动调用close,本地进入LAST_ACK,在本地接收到ACK之后,就进入CLOSED状态.

 

 



版权申明:
转载文章请注明原文出处http://blog.csdn.net/feiyinzilgd/archive/2010/09/19/5893995.aspx

并请联系谭海燕本人或者前往谭海燕个人主页留言

时间: 2024-10-31 12:41:42

Linux 网络编程 之 TCP状态转换的相关文章

Linux网络编程socket选项之SO_LINGER,SO_REUSEADDR

                       Linux网络编程socket选项之SO_LINGER,SO_REUSEADDR Linux网络编程中,socket的选项很多.其中几个比较重要的选项有:SO_LINGER(仅仅适用于TCP,SCTP), SO_REUSEADDR.   SO_LINGER 在默认情况下,当调用close关闭socke的使用,close会立即返回,但是,如果send buffer中还有数据,系统会试着先把send buffer中的数据发送出去,然后close才返回.

Linux网络编程入门

(一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍 客户端和服务端          网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户端         在网络程序中,如果一个程序主动和外面的程序通信,那么我们把这个程序称为客户端程序. 比如我们使用ftp程序从另外一         个地方获取文件的时候,是我们的ftp程序主动同外面进行通信(获取文件), 所以这个地方我们的ftp程序就是客户端程序.  服务端        

Proxy源代码分析--谈谈如何学习linux网络编程

原创地址: http://fanqiang.chinaunix.net/a4/b7/20010810/1200001101.html   Linux是一个可靠性非常高的操作系统,但是所有用过Linux的朋友都会感觉到,Linux和Windows这样的"傻瓜"操作系统(这里丝毫没有贬低Windows的意思,相反这应该是Windows的优点)相比,后者无疑在易操作性上更胜一筹.但是为什么又有那么多的爱好者钟情于Linux呢,当然自由是最吸引人的一点,另外Linux强大的功能也是一个非常重要

处理Linux网络编程中的IP地址

 Linux网络服务能力非常强大,它的TCP/IP代码是最高级的.Linux的网络实现是模仿FreeBSD的,它支持FreeBSD的带有扩展的Sockets(套接字)和TCP/IP协议.它支持两个主机间的网络连接和Sockets通讯模型,实现了两种类型的Sockets:BSD Sockets和INET Sockets.它为不同的通信模型和服务质量提供了两种传输协议,即不可靠的.基于消息的UDP传输协议和可靠的.基于流的传输协议TCP,并且都是在IP网络协议上实现的.INET sockets是在以

linux 网络编程之TIME_WAIT状态

                                                         Linux 网络编程之TIME_WAIT状态                                                               刚刚开始看TCP socket的4次握手终止流程图的时候,对于最后的TIME_WAIT状态不是很理解.现在在回过头来研究,发现TIME_WAIT状态是一个很微妙状态.之所以设计TIME_WAIT状态的原因有2个原因:

linux网络编程libpcap获取网络接口信息失败

问题描述 linux网络编程libpcap获取网络接口信息失败 #include typedef u_int32_t in_addr_t; struct in_addr{ in_addr_t s_addr;}; void main(){ char error_content[PCAP_ERRBUF_SIZE]; struct in_addr net_ip_address; struct in_addr net_mask_address; char *net_interface; char *ne

Linux网络编程 epoll中EPOLLIN EPOLLOUT信号无法触发

问题描述 Linux网络编程 epoll中EPOLLIN EPOLLOUT信号无法触发 比如 if(events[i].events&EPOLLIN) { int bytes_read=read(m_sockfd,read_buf,READ_BUFFER_SIZE); } 这样会触发EPOLLIN 但如果把read()封装到比如service类的sread()函数中 if(events[i].events&EPOLLIN) { service.sread() } 便不会触发EPOLLIN事

Linux 网络编程 epoll中的EPOLLIN EPOLLOUT如何触发

问题描述 Linux 网络编程 epoll中的EPOLLIN EPOLLOUT如何触发 代码很长只截取关键部分 //服务器端 #include #include #include #include #include #include #include #include #include #include"locker.h" #include"threadpool.h" #include"http_conn.h" #include"htt

socket-刚学linux网络编程,有个问题,listen( )函数可以用来监听其他电脑的端口吗?

问题描述 刚学linux网络编程,有个问题,listen( )函数可以用来监听其他电脑的端口吗? 如果可以是不是可以用这样的流程,先socket()创建描述符, 然后再bind()绑定一个IP地址跟端口? 解决方案 实在是没看懂你的需求 解决方案二: listen是侦听本机的端口,只有服务器端才需要这么做,你想监听其他主机,就需要在局域网路由器等上面做流量监控 解决方案三: 可以,基于socket的编程,只要绑定对IP地址就可以了.