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));

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/382297.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

153. 寻找旋转排序数组中的最小值 golang

153. 寻找旋转排序数组中的最小值 golang Me func findMin(nums []int) int {if len(nums) < 2 {return nums[0]}i, j : 0, 1for j < len(nums) {if nums[i] < nums[j] {ij} else {return nums[j]}}return nums[0] }

linux网络编程之多路I/o转接服务器select

(1)多路IO转接服务器也叫做多任务IO服务器&#xff0c;其主要思想是不再由程序自己监听客户端连接&#xff0c;取而代之的是由内核替应用程序监视文件&#xff0c;具体实现模型如图所示&#xff1a; 当客户端请求和服务器连接时&#xff0c;内核接收到连接指令&#xff0c;告诉…

linux网络编程之多路I/O转接服务器poll函数

&#xff08;1&#xff09;poll函数 头文件&#xff1a;#include<poll.h> int poll(struct pollfd*fds, nfds_t nfds,int timeout); struct pollffd{ int fd;//文件描述符 short events;//监控的事件 short revents;//监控事件中满足条件返回的事情 }&#xff1…

540. 有序数组中的单一元素 golang

540. 有序数组中的单一元素 golang func singleNonDuplicate(nums []int) int {if len(nums) < 1 {return nums[0]}i : 0for i < len(nums) - 1 {if nums[i] ! nums[i1] {return nums[i]} else {i2}}return nums[i] }

C/C++构造及析构顺序及变量的生命周期

&#xff08;1&#xff09;变量的构造及析构顺序 1&#xff09;在全局范围内定义的对象&#xff08;即在所有函数之外定义的对象&#xff09;&#xff0c;它的构造函数在文件中的所有函数&#xff08;包括main函数&#xff09;执行之前调用。如果一个程序中有多个文件&#xff…

34. 在排序数组中查找元素的第一个和最后一个位置 golang

34. 在排序数组中查找元素的第一个和最后一个位置 https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/submissions/ Me func searchRange(nums []int, target int) []int {result : make([]int, 2)result[0] -1result[1] -1for …

C/C++继承与派生

&#xff08;1&#xff09;派生类的访问属性 1&#xff09;public继承&#xff1a;派生类中&#xff1a;可以访问基类的public和protect变量&#xff0c;不可以访问基类的private变量 派生类外&#xff1a;可以访问基类的public变量&#xff0c;不能访问基类的private变量 2&am…

C/C++之string类小结

&#xff08;1&#xff09;C字符串和C字符串的转换 C提供了三种方法可以将C字符串转化为C字符串&#xff0c;分别是data(),c_str(),copy()成员函数来实现。 1&#xff09;data()是以字符数组的形式返回字符串内容&#xff0c;但并不添加‘\0’&#xff1b; 2&#xff09;c_str(…

2.两数相加 golang

测试用例1500多个&#xff0c;考虑的情况非常多 测试用例 [0] [1] [2] [3,4,2] [5,0] [2] [1] [0] [9,8] [0] [4,6,5] [5,0] [1] [9] [0] [0,9] [2] [8,0,7] [0,1] [3] [0,1]func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {result : &List…

C/C++之vector的内存管理和效率

(1)vector容器支持随机访问&#xff0c;其内部是通过动态数组实现的&#xff1b; (2)当vector执行insert或者push_back时&#xff0c;如果此时动态数组的内存不够用&#xff0c;则会重新分配当前大小的1.5~2倍的新内存区&#xff0c;把原来数组的内容复制过去&#xff1b; (3)为…

汇顶软件开发初面总结20180921

博客参考&#xff1a;C中的多态和内部实现&#xff1a;https://www.cnblogs.com/qiaoconglovelife/p/5128523.html 虚函数表存放的地址&#xff1a;https://blog.csdn.net/jiary5201314/article/details/52627630 为什么STL和linux都采用红黑树作为平衡树的实现&#xff1a;htt…

LeetCode 21. 合并两个有序链表 golang

递归 func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {if nil l1 {return l2}if nil l2 {return l1}if l1.Val < l2.Val {l1.Next mergeTwoLists(l1.Next, l2)return l1} else {l2.Next mergeTwoLists(l1, l2.Next)return l2} }Me(存在问题)非递归版本实现…

深信服C/C++技术一面二面20180924

技术一面&#xff1a;主要是一些关于数据结构和C/C相关的内容 1)链表和数组的相同点和不同点&#xff1b; 2&#xff09;了解静态链表吗&#xff1f;怎么用数组实现静态链表&#xff1f; 3&#xff09;使用库函数strcpy应该注意的问题有哪些&#xff1f; 4&#xff09;链表…

83. 删除排序链表中的重复元素 golang

83. 删除排序链表中的重复元素 golang Me func deleteDuplicates(head *ListNode) *ListNode {if head nil || head.Next nil {return head}result : headfor head ! nil && head.Next ! nil {for head.Val head.Next.Val {head.Next head.Next.Nextif head.Next…

《C++ Primer第五版》习题答案

博客转载&#xff1a;https://blog.csdn.net/misayaaaaa/article/details/53786215 第一章&#xff1a;https://blog.csdn.net/misayaaaaa/article/details/53200001 第二章&#xff1a; 1~10题&#xff1a;https://blog.csdn.net/misayaaaaa/article/details/53200773 11~…

《C++ Primer第五版》第一章-------IO机制和注释缩进

C Primer第一章的内容相对来说比较基础&#xff0c;主要是对C中程序编译的流程、C中的IO机制&#xff0c;for和while循环的介绍、类的构成和注释方法及缩进方法做了简要的介绍&#xff0c;本次博客主要从C中的IO机制和注释缩进等方面做一个总结记录&#xff0c;如果在总结过程中…

19.删除链表的倒数第N个节点 golang

官解 一遍写出来有难度。 [1,2] 2 [2][1,2]1 [1]func removeNthFromEnd(head *ListNode, n int) *ListNode {if n < 0 || head nil {return head}fast : headfor i : 1; i < n && fast ! nil; i{fast fast.Next}if fast nil {return head.Next}slow : headfor…

《C++ Primer 第五版》第二章(1-4小节)------基本内置类型,初始化和赋值及声明和定义,指针和引用,const和constexpr

C Primer第二章的内容主要介绍了变量和基础类型&#xff0c;包括C语言定义的基础内置类型、变量的定义及声明、符合类型如指针及引用的介绍和const及常量表达式constexpr的介绍&#xff0c;本次博客也从这四个方面进行系统的介绍&#xff0c;如果有不足之处&#xff0c;还望其他…

455. 分发饼干 golang

455. 分发饼干 Me func findContentChildren(g []int, s []int) int {if len(s) 0 {return 0}sort.Ints(g)sort.Ints(s)var count, i, j int 0, 0, 0for { if g[i] < s[j] {i, j, count i1, j1, count1} else {j}if i > len(g) || j > len(s) {return count}}re…

《C++ Primer 第五版》第二章(第5小节)——using和typedef,auto和decltype总结

1.using和typedef&#xff08;作用&#xff1a;定义类型别名&#xff09; 1)typedef和using都可以用来定义一个类型别名&#xff0c;二者在类型别名上定义没有区别。只是需要注意的是类型和类型别名的顺序&#xff0c;使用typedef定义类型别名的结构为 typedef 类型 类型别名&a…