(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状态转换及端口复用相关推荐

  1. Linux网络编程之TCP状态转移

    Linux网络编程之TCP状态转移 一.TCP状态转移时序 二.半关闭及shutdown函数 一.TCP状态转移时序 TCP状态转移图: netstat -apn | grep client 查看客户 ...

  2. 【Linux网络编程】TCP状态转换、半关闭、2MSL时长

    ------------->[Linux系统编程/网络编程](学习目录汇总) <-------------- 目录 1. 三次握手.四次挥手过程中的状态变化 2. TCP状态转换图 3. ...

  3. linux socket编程之TCP与UDP

    转:http://blog.csdn.net/gaoxin1076/article/details/7262482 TCP/IP协议叫做传输控制/网际协议,又叫网络通信协议 TCP/IP虽然叫传输控制 ...

  4. 数据连接linux网络编程之TCP/IP基础(四):TCP连接的建立和断开、滑动窗口

    在写这篇文章之前,xxx已经写过了几篇关于改数据连接主题的文章,想要了解的朋友可以去翻一下之前的文章 一.TCP段格式: TCP的段格式如下图所示 源端口号与目标端口号 源端口号和目标端口号,加上IP ...

  5. linux网络编程之用select函数实现io复用(基于TCP)引发的思考

    1.基本概念 IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程.IO多路复用适用如下场合: (1)当客户处理多个描述字时(一般是交互式输入和网络套接口),必须使用I/ ...

  6. linux网络编程之TCP三次握手和四次挥手

    1.在TCP连接的过程中,有三个阶段,分别是建立连接,传递数据和断开连接,通讯时序图如下所示: 2.结合TCP数据报格式分析建立连接的三次握手 1)首先客户端发送一个带有SYN标志的TCP报文给服务器 ...

  7. linux网络编程之用select方法实现io复用(基于udp)

    1.基本概念 IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程.IO多路复用适用如下场合: (1)当客户处理多个描述字时(一般是交互式输入和网络套接口),必须使用I/ ...

  8. Centos网络编程之tcp十一种状态及问题处理办法

    尊重原创版权: https://www.noveljp.com/hot/43730.html 更多内容参考: https://www.noveljp.com/ Linux网络编程之tcp十一种状态及问 ...

  9. 基于Linux的Socket编程之TCP全双工Server-Client聊天程序

    转载:http://blog.csdn.net/apollon_krj/article/details/53437764#0-tsina-1-58570-397232819ff9a47a7b7e80a ...

最新文章

  1. php 文件移动到文件夹,PHP-将文件移至服务器上的其他文件夹
  2. 【SQL】数据库的SQL查询,涉及多个数据库
  3. 扎克伯格的中文夜:想要成功就不能放弃
  4. Git图形化管理工具
  5. linux虚拟主机_Windows虚拟主机和linux虚拟主机有什么区别?
  6. bootstrap3 中文手册 [下载]
  7. RH850/F1x的PWM-Diag功能分析
  8. python 面板数据分析_stata面板数据模型分析的详细步骤和命令
  9. ddr5内存上市时间_DDR5内存年底开始量产,2022年成为主流!
  10. 2021年山东省安全员C证报名考试及山东省安全员C证操作证考试
  11. c++ vs2015 播放音乐_三星s20都取消了耳机孔,1k-2k的播放器会成为直推党新选择吗?...
  12. 20200525-生物技术-四川师范大学自考生物技术(本科)考试计划.txt
  13. Linux下清理删除last登录日志
  14. 从自建服务器到选择阿里云我们都应该慎重决定
  15. 在R语言中如何打开一般方法打不开的中文xls文件?
  16. Mac上使用LaTeX(小白入门配置Latex)
  17. 图像处理--角点检测
  18. 魅族官网 div+盒子
  19. Qt QByteArray字节数组
  20. 浏览器去广告(Adblock Plus离线安装)

热门文章

  1. vue笔记(一)基本使用、数据检测
  2. 拓扑排序最长链-P3119 [USACO15JAN]草鉴定Grass Cownoisseur
  3. quagga源码分析--路由信息处理zebra-rib
  4. Css Sprites 多张图片整合在一张图片上
  5. 即时聊天IM之二 openfire 整合现有系统用户
  6. java连接oracle数据库 -- jdbc连接
  7. Linq list 排序,Dictionary 排序
  8. UIImage 压缩
  9. JS 对GridView的一些操作
  10. python语言精通_Python语言基础从入门到精通