linux网路编程之TCP状态转换及端口复用
(1)TCP状态转换图
其中图中分为三种状态:实线代表的主动发起连接,虚线代表的被动发起连接,细实线代表的可以双向发起连接的状态。
主动发起连接方状态变化:1)主动发起连接的一方发送SYN标志位,进入SYN_SENT状态,等待接收被发起连接方发送ACK应答和数据包序号,接收到ACK应答后,同时向被被发起连接方发送ACK应答,表示数据已经接收到,同一发起连接,此时进入ESTABLISHED状态,表示三次握手完成。2)主动发起连接的一方向另一方发送FIN标志位,请求关闭连接,立即进入FIN_WATI_1,等待被动发起连接方发送ACK应答信号,主动发起连接方接收到ACK应答信号后,进入FIN_WATI_2状态,代表主动发起连接端半关闭完成。此时,如果被动连接方发送FIN信号请求关闭连接,主动发起连接的一方会发送一个ACK应答信号同意关闭,但是此时不确定被动发起连接方是否收到信号(因为主动发起连接方已经关闭),所以要等待一个2MSL时间(确保最后发送的一个ACK应答信号被接收到),2MSL时间一到,被动连接方关闭,四次挥手完成。
被动发起连接方状态变化:1)被动发起连接方处于监听状态,等待连接,当被动发起连接方接收到主动方SYN状态请求连接时,被动发起连接方会发送一个ACK应答同时携带自己的数据报序号给主动方,进入SYN_RCVD状态,等待主动方发送ACK应答信号,当接收到主动方发起的ACK应答信号时,被动发起连接方进入ESTABLISHED状态,表示三次握手完成。2)当主动方发送FIN请求关闭时,被动连接方接收FIN并同时向主动方发送ACK应答,同意关闭,此时被动连接方进入CLOSE_WAIT状态。如果此时被动连接方发送FIN信号,则进入LAST_ACK状态,等待主动方的应答信号,当接收到主动方的应答信号,被动方关闭,四次挥手完成。
双向连接状态:1)当被动发起连接方进入SYN_RCVD状态,等待主动发起方发送ACK应答信号时,此时如果网络中断,则三次握手中断,重新进行三次握手,被接受方发送RST信号,重新连接。2)主动发起连接方接收到FIN信号进入FIN_WAIT_1状态,此时如果主动接收到ACK和FIN信号,同时给被动方发送ACK应答信号,则主动方进入TIME_WAIT状态,等待2MSL时间关闭文件。如果只收到ACK应答信号和FIN信号,则会进入CLOSING状态,当主动发送ACK应答信号时,主动方进入TIME_WAIT状态,等待2MSL时间关闭文件。
(2)C/S模型的TCP状态图
(3)半关闭
当TCP链接中A发送FIN请求关闭,B端回应ACK后(A端进入FIN_WAIT_2状态),B没有立即发送FIN给A,此时A处于半关闭状态,A可以接收B发送的数据,但是A不能向B发送数据了。
使用close关闭文件描述符只是中止一个连接,它减少的只是描述符的引用计数,并不直接关闭连接,当引用计数达到0时,才关闭连接。而使用shutdown不考虑描述符的引用计数,直接关闭描述符,也可以中止一个方向的连接,只中止读或者写。
#include<sys/socket.h>
int shutdown(int sockfd,int how)
参数:how SHUT_RD(0):关闭套接字读功能缓存区
SHUT_WR(1):关闭套接字写功能缓存区
SHUT_RDWR(2):关闭套接字读写功能缓存区
(4)端口复用
当服务器断开连接时,实际上此时服务器使用的端口处于TIME_WAIT状态,需要等待2MSL时间才能重新被利用。如果想要在服务器断开连接时端口可以被使用,则需要使用端口复用功能,具体方法是使用setsockopt()设置socket描述符选项的S0_REUSEADDR为1,表示允许创建端口号相同,但IP地址不同的多个socket描述符。
在server代码中的socket()和bind()之间插入代码:
int opt=1;
setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
linux网路编程之TCP状态转换及端口复用相关推荐
- Linux网络编程之TCP状态转移
Linux网络编程之TCP状态转移 一.TCP状态转移时序 二.半关闭及shutdown函数 一.TCP状态转移时序 TCP状态转移图: netstat -apn | grep client 查看客户 ...
- 【Linux网络编程】TCP状态转换、半关闭、2MSL时长
------------->[Linux系统编程/网络编程](学习目录汇总) <-------------- 目录 1. 三次握手.四次挥手过程中的状态变化 2. TCP状态转换图 3. ...
- linux socket编程之TCP与UDP
转:http://blog.csdn.net/gaoxin1076/article/details/7262482 TCP/IP协议叫做传输控制/网际协议,又叫网络通信协议 TCP/IP虽然叫传输控制 ...
- 数据连接linux网络编程之TCP/IP基础(四):TCP连接的建立和断开、滑动窗口
在写这篇文章之前,xxx已经写过了几篇关于改数据连接主题的文章,想要了解的朋友可以去翻一下之前的文章 一.TCP段格式: TCP的段格式如下图所示 源端口号与目标端口号 源端口号和目标端口号,加上IP ...
- linux网络编程之用select函数实现io复用(基于TCP)引发的思考
1.基本概念 IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程.IO多路复用适用如下场合: (1)当客户处理多个描述字时(一般是交互式输入和网络套接口),必须使用I/ ...
- linux网络编程之TCP三次握手和四次挥手
1.在TCP连接的过程中,有三个阶段,分别是建立连接,传递数据和断开连接,通讯时序图如下所示: 2.结合TCP数据报格式分析建立连接的三次握手 1)首先客户端发送一个带有SYN标志的TCP报文给服务器 ...
- linux网络编程之用select方法实现io复用(基于udp)
1.基本概念 IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程.IO多路复用适用如下场合: (1)当客户处理多个描述字时(一般是交互式输入和网络套接口),必须使用I/ ...
- Centos网络编程之tcp十一种状态及问题处理办法
尊重原创版权: https://www.noveljp.com/hot/43730.html 更多内容参考: https://www.noveljp.com/ Linux网络编程之tcp十一种状态及问 ...
- 基于Linux的Socket编程之TCP全双工Server-Client聊天程序
转载:http://blog.csdn.net/apollon_krj/article/details/53437764#0-tsina-1-58570-397232819ff9a47a7b7e80a ...
最新文章
- php 文件移动到文件夹,PHP-将文件移至服务器上的其他文件夹
- 【SQL】数据库的SQL查询,涉及多个数据库
- 扎克伯格的中文夜:想要成功就不能放弃
- Git图形化管理工具
- linux虚拟主机_Windows虚拟主机和linux虚拟主机有什么区别?
- bootstrap3 中文手册 [下载]
- RH850/F1x的PWM-Diag功能分析
- python 面板数据分析_stata面板数据模型分析的详细步骤和命令
- ddr5内存上市时间_DDR5内存年底开始量产,2022年成为主流!
- 2021年山东省安全员C证报名考试及山东省安全员C证操作证考试
- c++ vs2015 播放音乐_三星s20都取消了耳机孔,1k-2k的播放器会成为直推党新选择吗?...
- 20200525-生物技术-四川师范大学自考生物技术(本科)考试计划.txt
- Linux下清理删除last登录日志
- 从自建服务器到选择阿里云我们都应该慎重决定
- 在R语言中如何打开一般方法打不开的中文xls文件?
- Mac上使用LaTeX(小白入门配置Latex)
- 图像处理--角点检测
- 魅族官网 div+盒子
- Qt QByteArray字节数组
- 浏览器去广告(Adblock Plus离线安装)