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.pswp.cn/news/382297.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/382297.shtml
英文地址,請注明出處:http://en.pswp.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…