重學TCP協議(5) 自連接

1.自連接是什么

在發起連接時,TCP/IP的協議棧會先選擇source IP和source port,在沒有顯示調用bind()的情況下,source IP由路由表確定,source port由TCP/IP協議棧從local port range中選取尚未使用的port。

如果destination IP正好是本機,而destination port位于local port range,且沒有服務器監聽(listen)的話,source port可能正好選中了destination port這就出現了(source IP,source port)=(destination IP,destination port)的情況,即發生了自連接。

2.自連接是怎么發生的

1. 兩個tcp連接同時打開

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-1ax6Cx2X-1620216330809)(https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/43753ba6ae7f4b3eb984a2d0ff204720~tplv-k3u1fbpfcp-watermark.image)]

2.本來正常運行的客戶端和服務端,服務端偶然掛掉之后,客戶端再去連接它,就有可能出現自連接現象。

例如:同一臺機器上的客戶端和服務端(端口:50000)建立了一個長連接,服務端的進程掛掉了,端口50000釋放,客戶端去connect這個服務端的目的端口的時候正好選擇了50000作為源端口,此時該端口沒人用(因為服務端掛斷了),使用是合法的,于是自連接形成了。

3.如何防止自連接

1. 讓服務監聽的端口與客戶端隨機分配的端口不可能相同即可

因為客戶端隨機分配的范圍由 /proc/sys/net/ipv4/ip_local_port_range 文件決定,,所以只要讓服務監聽的端口小于 客戶端分配的端口范圍,就不會出現客戶端與服務端口相同的情況。

2. 出現自連接的時候,主動關掉連接

例如在Go語言的tcp庫中,加入的自連接判斷

func selfConnect(fd *netFD, err error) bool {// If the connect failed, we clearly didn't connect to ourselves.if err != nil {return false}// The socket constructor can return an fd with raddr nil under certain// unknown conditions. The errors in the calls there to Getpeername// are discarded, but we can't catch the problem there because those// calls are sometimes legally erroneous with a "socket not connected".// Since this code (selfConnect) is already trying to work around// a problem, we make sure if this happens we recognize trouble and// ask the DialTCP routine to try again.// TODO: try to understand what's really going on.if fd.laddr == nil || fd.raddr == nil {return true}l := fd.laddr.(*TCPAddr)r := fd.raddr.(*TCPAddr)return l.Port == r.Port && l.IP.Equal(r.IP)
}

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

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

相關文章

Gradle復制文件/目錄方法

2019獨角獸企業重金招聘Python工程師標準>>> gradle復制文件/文件夾方法 復制文件 //復制IDE生成的classes.jar文件到build/libs中,并改名為FileUtils.jar. task copyFile(type:Copy) {delete build/libs/FileUtils.jarfrom(build/intermediates/bundles…

用戶參與度與活躍度的區別_用戶參與度突然下降

用戶參與度與活躍度的區別disclaimer: I don’t work for Yammer, this is a public data case study, I’ve written it in a narrative format to make this case study more engaging to read.免責聲明:我不為Yammer工作,這是一個公共數據案例研究&am…

python:__new__()與__init__()

參考:https://blog.csdn.net/qq_41020281/article/details/79638370 轉載于:https://www.cnblogs.com/gcgc/p/11585599.html

重學TCP協議(6) 四次揮手

1. 四次揮手 客戶端進程發出連接釋放報文,并且停止發送數據。釋放數據報文首部,FIN1,其序列號為sequ(等于前面已經傳送過來的數據的最后一個字節的序號加1),此時,客戶端進入FIN-WAIT-1&#xff…

mysql數據庫部分操作指令

用cmd開啟服務時拒絕訪問. 原因:不是管理員用戶,沒有權限 將服務中的 MySQL設置為手動啟動, 否則 開機自動啟動. 啟動mysql服務,用管理員權限打開dos界面 windowsX A 打開開始界面 點擊管理員開啟cmd 啟動服務:net start …

推箱子2-向右推!_保持冷靜并砍箱子-嗶

推箱子2-向右推!Hack The Box (HTB) is an online platform allowing you to test your penetration testing skills. It contains several challenges that are constantly updated. Some of them simulating real world scenarios and some of them leaning more towards a C…

UML建模圖實戰筆記

一、前言 UML:Unified Modeling Language(統一建模語言),使用UML進行建模的作用有哪些: 可以更好的理解問題可以及早的發現錯誤或者被遺漏的點可以更加方便的進行組員之間的溝通支持面向對象軟件開發建模,可…

數據草擬:使您的團隊熱愛數據的研討會

Learn the rules to Data Draw Up; a fun way to get your teams invested in data.了解數據收集的規則; 一種讓您的團隊投入數據的有趣方式。 Let’s keep things short. Metrics are one of the most important things in Product Management. They help us to u…

python:列表推導式

python中有種獨特的語法:推導式,可以將代碼壓縮到1行,但是不使用也不影響。 有三種:列表、字典、集合(注意沒有元組推導式) 列表推導式 # 1、一行代碼實現1—100之和(知識點:列表推導式) print(…

WPF中刪除打開過的圖片

WPF中刪除打開過的圖片 原文:WPF中刪除打開過的圖片在WPF中,當我們刪除打開過的圖片時,往往會遇到"...無法刪除,文件正在被另一個進程使用"的異常。即使當前文件是打開后關閉過的也不行。 這個問題的原因很簡單,是因為W…

深入理解InnoDB(5)-文件系統

1. 數據庫和文件系統的關系 像 InnoDB 、 MyISAM 這樣的存儲引擎都是把表存儲在文件系統上的。當我們想讀取數據的時候,這些存儲引擎會從文件系統中把數據讀出來返回給我們,當我們想寫入數據的時候,這些存儲引擎會把這些數據又寫回文件系統。…

vim捐贈_#PayItBackwards-一位freeCodeCamp畢業生如何向事業捐贈10,000美元

vim捐贈On Monday my phone suddenly started buzzing. Shawn Wang, AKA Swyx, had just tweeted about a donation hed made to freeCodeCamp.org.星期一,我的電話突然開始嗡嗡作響。 Awn Swyx的Shawn Wang剛剛在推特上發布了他對freeCodeCamp.org的捐款。 I glan…

Digital River拉來Netconcepts站臺 亞太營銷服務升級

它是大洋彼岸的一家網絡軟件下載、分銷商,很多重量級的軟件行業領軍企業都是其客戶,它一直低調摸索亞太營銷的路子,在今年九月份,它一改常態,高調宣布入華,三個月后,它帶來了最新消息&#xff1…

按下按鈕_按下

按下按鈕Updated with the latest data: 23/8/2020更新最新數據:23/8/2020 As restrictions are lifted for Laois and Offaly, difficult times are set to continue for the people of Kildare, at least for another couple of weeks, as they continue to fight…

windows中怎么添加定時任務

linux中有crontab定時任務,很方便 其實windows也有類似的 需求:定時執行python腳本 1、Windows鍵R,調出此窗口,輸入compmgmt.msc 2、 轉載于:https://www.cnblogs.com/gcgc/p/11594467.html

css設置黑體宋體等(轉)

代碼如下: .selector{ font-family:"Microsoft YaHei",微軟雅黑,"MicrosoftJhengHei",華文細黑,STHeiti,MingLiu } 說明: 加上中文名“微軟雅黑”是為了兼容opera。 MicrosoftJhengHei為微軟正黑體,STHeiti為華文黑體,Mi…

重學TCP協議(7) Timestamps 選項

1.Timestamps 選項的組成部分 時間戳選項占10個字節 kind(1字節) + length(1字節) info (8字節),其中kind8,length10,info由timestamp(TS value)和timestamp echo(TS Echo Reply)兩…

sudoku代碼_首席執行官可以編碼嗎? 在星期六晚上坐在酒吧時,從頭開始觀看Netlify首席執行官的Sudoku應用程序代碼

sudoku代碼Netlify CEO Matt Biilmann live-codes a Sudoku app using Netlify in this tutorial video. Matt shows how simple and quick it can be to create a working app using the JAMstack.在本教程視頻中,Netlify CEO Matt Biilmann使用Netlify對Sudoku應用…

c++ 時間序列工具包_我的時間序列工具包

c 時間序列工具包When it comes to time series forecasting, I’m a great believer that the simpler the model, the better.關于時間序列預測,我堅信模型越簡單越好。 However, not all time series are created equal. Some time series have a strongly defi…

bash 的相關配置

bash 參數自動補全 請安裝 bash-completion bash 提示符 說明:參考文檔 1. 簡潔風格 if [[ ${EUID} 0 ]] ; then PS1\[\033[01;32m\][\[\033[01;35m\]\u\[\033[01;37m\] \w\[\033[01;32m\]]\$\[\033[00m\] else PS1\[\033[01;32m\][\u\[\033[01;37m\] \w\[\033[01;…