linux網絡編程之TCP三次握手和四次揮手

1.在TCP連接的過程中,有三個階段,分別是建立連接,傳遞數據和斷開連接,通訊時序圖如下所示:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

2.結合TCP數據報格式分析建立連接的三次握手

??

? ? ? ? ? ? ? ?1)首先客戶端發送一個帶有SYN標志的TCP報文給服務器端,詢問服務器端是否可以通信。其中32位序號為1000,數據大小為0,數據報文的最大長度為1460;

? ? ? ? ? ? ? ?2)服務器端接收到客戶端的數據,回應客戶端,想客戶端發送一個報文,同時攜帶了SYN和ACK標志,其中SYN標志后的數據序號為服務器端給客戶端發送的報文的32位序號為8000,詢問客戶端是否可以通信。ACK后面的數據為服務器端接受客戶端數據后的確認序號(表示1001以前的數據報,服務器端都接收到了)。

? ? ? ? ? ? ? ?3)客戶端再向服務器端發送一個ACK數據報,表示可以通信,此時通信開始。

3.數據傳輸

? ? ? ? ? ?數據傳輸的過程中,可能因為數據太大,超出了數據包可以容納的最大數據,此時會將數據包分包處理,所以數據的傳輸過程并不是服務器和客戶端的一來一回的通信。

4.TCP關閉連接的四次揮手

? ? ? ? ? ? 由于TCP連接采用的是全雙工的方式,因此每個方向都必須單獨關閉,此時指定FIN標志來終止某個方向的連接。收到一個FIN意味著這個方向沒有數據流動,另一個方向仍然可以發送數據(半關閉)。

? ? ? ? ? ?1)客戶端發送FIN請求。

? ? ? ? ? ?2)服務端接收請求并發送ACK來允許請求關閉。

? ? ? ? ? ?3)服務器端向客戶端發送FIN請求關閉連接。

? ? ? ? ? ?4)客戶端發送ACK允許關閉。

5.注意事項

? ? ? ? ? ? TCP通信是面向連接的可靠數據包傳遞,相對于UDP的無連接不可靠報文傳輸而言,數據傳遞更加有保證。但是,TCP和UDP在數據傳輸中,都會出現丟包現象,只是TCP在出現丟包的時候,可以通過ACK后面的確定序號來告訴用戶收到了哪些數據,如果出現丟包,則需要重新發送。

? ? ? ? ? ? TCP規定SYN位和FIN位都要占一個序號,雖然沒有發送數據,但是發送了SYS/FIN位,所以下次發送數據時使用的序號需要+1;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/382303.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/382303.shtml
英文地址,請注明出處:http://en.pswp.cn/news/382303.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

451. 根據字符出現頻率排序golang

官解 func frequencySort(s string) string {charMap : make(map[rune]int)arr : make([]string, len(s))for _,c : range s {charMap[c]}for k,v : range charMap {arr[v - 1] strings.Repeat(string(k), v)}r : ""for _,c : range arr {r c r}return r }自定義排…

linux網路編程之多進程并發服務器

1)使用多進程并發服務器考慮的因素: (1)父進程描述最大文件描述符的個數(父進程需要關閉accept返回的新文件描述符) (2)系統內可創建進程的個數(與內存大小相關&#xff…

69. x 的平方根 golang

Me https://leetcode-cn.com/problems/sqrtx/submissions/ func mySqrt(x int) int {return int(math.Sqrt(float64(x))) }

linux網路編程之多線程并發服務器

1)在使用進程模型開發服務器過程中考慮以下問題 (1)調整進程內最大文件描述符上限 (2)線程如有共享,考慮線程同步 (3)客戶端線程退出時,做退出處理(線程分離&…

744. 尋找比目標字母大的最小字母 golang

官解 func nextGreatestLetter(letters []byte, target byte) byte {idx : 0for i : 0; i < len(letters); i {if letters[i] > target {idx ibreak}}return letters[idx] }Me 這個題答得很差勁&#xff0c;可能有點累 func nextGreatestLetter(letters []byte, target…

linux網路編程之TCP狀態轉換及端口復用

&#xff08;1&#xff09;TCP狀態轉換圖 其中圖中分為三種狀態&#xff1a;實線代表的主動發起連接&#xff0c;虛線代表的被動發起連接&#xff0c;細實線代表的可以雙向發起連接的狀態。 主動發起連接方狀態變化&#xff1a;1&#xff09;主動發起連接的一方發送SYN標志位&…

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…