unix的哲學(xué)是一切皆文件,可以把socket看成是一種特殊的文件,而一些socket函數(shù)就是對(duì)其進(jìn)行的操作api(讀/寫(xiě)IO、打開(kāi)、關(guān)閉)。我們知道普通文件的打開(kāi)操作(open)返回一個(gè)文件描述字,與之類似,socket()用于創(chuàng)建一個(gè)socket描述符(socket descriptor),它唯一標(biāo)識(shí)一個(gè)socket。

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)建站!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、小程序制作、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了蕭山免費(fèi)建站歡迎大家使用!
當(dāng)我們調(diào)用socket創(chuàng)建一個(gè)socket時(shí),返回的socket描述字它存在于協(xié)議族(address family,AF_XXX)空間中,但沒(méi)有一個(gè)具體的地址。如果想要給它賦值一個(gè)地址,就必須調(diào)用bind()函數(shù),
?sockfd即socket描述字,它是通過(guò)socket()函數(shù)創(chuàng)建了,唯一標(biāo)識(shí)一個(gè)socket。bind()函數(shù)就是將給這個(gè)描述字綁定一個(gè)名字。
在將一個(gè)地址綁定到socket的時(shí)候,需要先將主機(jī)字節(jié)序轉(zhuǎn)換成為網(wǎng)絡(luò)字節(jié)序,而不要假定主機(jī)字節(jié)序跟網(wǎng)絡(luò)字節(jié)序一樣使用的是Big-Endian。由于這個(gè)問(wèn)題曾引發(fā)過(guò)不少血案,謹(jǐn)記對(duì)主機(jī)字節(jié)序不要做任何假定,務(wù)必將其轉(zhuǎn)化為網(wǎng)絡(luò)字節(jié)序再賦給socket。
這里的主機(jī)字節(jié)序就是我們平常說(shuō)的大端和小端模式:不同的CPU有不同的字節(jié)序類型,這些字節(jié)序是指整數(shù)在內(nèi)存中保存的順序,這個(gè)叫做主機(jī)序。引用標(biāo)準(zhǔn)的Big-Endian和Little-Endian的定義如下:
? ?listen函數(shù)的第一個(gè)參數(shù)即為要監(jiān)聽(tīng)的socket描述字,第二個(gè)參數(shù)為socket可以接受的排隊(duì)的最大連接個(gè)數(shù)。listen函數(shù)表示等待客戶的連接請(qǐng)求。
? connect函數(shù)的第一個(gè)參數(shù)即為客戶端的socket描述字,第二參數(shù)為服務(wù)器的socket地址,第三個(gè)參數(shù)為socket地址的長(zhǎng)度。客戶端通過(guò)調(diào)用connect函數(shù)來(lái)建立與TCP服務(wù)器的連接。
?TCP服務(wù)器端依次調(diào)用socket()、bind()、listen()之后,就會(huì)監(jiān)聽(tīng)指定的socket地址了。TCP客戶端依次調(diào)用socket()、connect()之后就向TCP服務(wù)器發(fā)送連接請(qǐng)求。TCP服務(wù)器監(jiān)聽(tīng)到這個(gè)請(qǐng)求之后,就會(huì)調(diào)用accept()函數(shù)去接收請(qǐng)求,這樣連接就建立好了(在connect之后就建立好了三次連接),之后就可以開(kāi)始進(jìn)行類似于普通文件的網(wǎng)絡(luò)I/O操作了。
?如果accpet成功,那么其返回值是由內(nèi)核自動(dòng)生成的一個(gè)全新的描述字,代表與客戶的TCP連接。
?accept的第一個(gè)參數(shù)為服務(wù)器的socket描述字,是服務(wù)器開(kāi)始調(diào)用socket()函數(shù)生成的,稱為監(jiān)聽(tīng)socket描述字;而accept函數(shù)返回的是已連接的socket描述字。一個(gè)服務(wù)器通常通常僅僅只創(chuàng)建一個(gè)監(jiān)聽(tīng)socket描述字,它在該服務(wù)器的生命周期內(nèi)一直存在。內(nèi)核為每個(gè)由服務(wù)器進(jìn)程接受的客戶連接創(chuàng)建了一個(gè)已連接socket描述字,當(dāng)服務(wù)器完成了對(duì)某個(gè)客戶的服務(wù),相應(yīng)的已連接socket描述字就被關(guān)閉。
?read函數(shù)是負(fù)責(zé)從fd中讀取內(nèi)容.當(dāng)讀成功時(shí),read返回實(shí)際所讀的字節(jié)數(shù),如果返回的值是0表示已經(jīng)讀到文件的結(jié)束了,小于0表示出現(xiàn)了錯(cuò)誤。如果錯(cuò)誤為EINTR說(shuō)明讀是由中斷引起的,如果是ECONNREST表示網(wǎng)絡(luò)連接出了問(wèn)題。
?write函數(shù)將buf中的nbytes字節(jié)內(nèi)容寫(xiě)入文件描述符fd.成功時(shí)返回寫(xiě)的字節(jié)數(shù)。失敗時(shí)返回-1,并設(shè)置errno變量。 在網(wǎng)絡(luò)程序中,當(dāng)我們向昌碰套接字文件描述符寫(xiě)時(shí)有倆種可能。1)write的返回值大于0,表示寫(xiě)了部分或者是全部的數(shù)據(jù)。2)返回的值小于0,此時(shí)出現(xiàn)了錯(cuò)誤
?在服務(wù)器與客戶端建立連接之后,會(huì)進(jìn)行一些讀寫(xiě)操作,完成了讀寫(xiě)操作就要關(guān)閉相應(yīng)的socket描述字,類似于操作完打開(kāi)的文件要調(diào)用fclose關(guān)閉打開(kāi)的文件。
?close一個(gè)TCP socket的缺省行為時(shí)把該socket標(biāo)記為已關(guān)閉,然后立即返回到調(diào)用進(jìn)程。該描述字不能再由調(diào)用進(jìn)程使用,也就是說(shuō)不能再作為read或write的第一個(gè)參數(shù)
?close操作只是使相應(yīng)socket描述字的引用計(jì)數(shù)-1,只有當(dāng)引用計(jì)數(shù)為0的時(shí)候,才會(huì)觸發(fā)TCP客戶端向服務(wù)器發(fā)送終止連接請(qǐng)求。
?我們知道tcp建立連接要進(jìn)行“三次握手”,即巖李交換三個(gè)分組。大致流程如下:
客戶端向服務(wù)器發(fā)送一個(gè)SYN J
服務(wù)器向客粗迅遲戶端響應(yīng)一個(gè)SYN K,并對(duì)SYN J進(jìn)行確認(rèn)ACK J+1
客戶端再想服務(wù)器發(fā)一個(gè)確認(rèn)ACK K+1
socket中TCP的四次握手釋放連接詳解
?某個(gè)應(yīng)用進(jìn)程首先調(diào)用close主動(dòng)關(guān)閉連接,這時(shí)TCP發(fā)送一個(gè)FIN M;另一端接收到FIN M之后,執(zhí)行被動(dòng)關(guān)閉,對(duì)這個(gè)FIN進(jìn)行確認(rèn)。一段時(shí)間之后,服務(wù)端調(diào)用close關(guān)閉它的socket。這導(dǎo)致它的TCP也發(fā)送一個(gè)FIN N;接收到這個(gè)FIN的源發(fā)送端TCP對(duì)它進(jìn)行確認(rèn),這樣每個(gè)方向上都有一個(gè)FIN和ACK。
為什么要三次握手
由于tcp連接是全雙工的,存在著雙向的讀寫(xiě)通道,每個(gè)方向都必須單獨(dú)進(jìn)行關(guān)閉。當(dāng)一方完成它的數(shù)據(jù)發(fā)送任務(wù)后就可以發(fā)送一個(gè)FIN來(lái)終止這個(gè)方向的連接。收到FIN只意味著這個(gè)方向上沒(méi)有數(shù)據(jù)流動(dòng),但并不表示在另一個(gè)方向上沒(méi)有讀寫(xiě),所以要雙向的讀寫(xiě)關(guān)閉需要四次握手,
3. time_wait狀態(tài)如何避免?
首先服務(wù)器可以設(shè)置SO_REUSEADDR套接字選項(xiàng)來(lái)通知內(nèi)核,如果端口忙,但TCP連接位于TIME_WAIT狀態(tài)時(shí)可以重用端口。在一個(gè)非常有用的場(chǎng)景就是,如果你的服務(wù)器程序停止后想立即重啟,而新的套接字依舊希望使用同一端口,此時(shí)SO_REUSEADDR選項(xiàng)就可以避免TIME_WAIT狀態(tài)。
1.客戶端連接服務(wù)器的80服務(wù),這時(shí)客戶端會(huì)啟用一個(gè)本地的端口訪問(wèn)服務(wù)器的80,訪問(wèn)完成后關(guān)閉此連接,立刻再次訪問(wèn)服務(wù)器的
80,這時(shí)客戶端會(huì)啟用另一個(gè)本地的端口,而不是剛才使用的那個(gè)本地端口。原因就是剛才的那個(gè)連接還處于TIME_WAIT狀態(tài)。
2.客戶端連接服務(wù)器的80服務(wù),這時(shí)服務(wù)器關(guān)閉80端口,立即再次重啟80端口的服務(wù),這時(shí)可能不會(huì)成功啟動(dòng),原因也是服務(wù)器的連
接還處于TIME_WAIT狀態(tài)。
實(shí)戰(zhàn)分析:
狀態(tài)描述:
CLOSED:無(wú)連接是活動(dòng)的或正在進(jìn)行
LISTEN:服務(wù)器在等待進(jìn)入呼叫
SYN_RECV:一個(gè)連接請(qǐng)求已經(jīng)到達(dá),等待確認(rèn)
SYN_SENT:應(yīng)用已經(jīng)開(kāi)始,打開(kāi)一個(gè)連接
ESTABLISHED:正常數(shù)據(jù)傳輸狀態(tài)
FIN_WAIT1:應(yīng)用說(shuō)它已經(jīng)完成
FIN_WAIT2:另一邊已同意釋放
ITMED_WAIT:等待所有分組死掉
CLOSING:兩邊同時(shí)嘗試關(guān)閉
TIME_WAIT:另一邊已初始化一個(gè)釋放
LAST_ACK:等待所有分組死掉/pre
命令解釋:
如何盡量處理TIMEWAIT過(guò)多?
編輯內(nèi)核文件/etc/sysctl.conf,加入以下內(nèi)容:
net.ipv4.tcp_syncookies = 1 表示開(kāi)啟SYN Cookies。當(dāng)出現(xiàn)SYN等待隊(duì)列溢出時(shí),啟用cookies來(lái)處理,可防范少量SYN攻擊,默認(rèn)為0,表示關(guān)閉;
net.ipv4.tcp_tw_reuse = 1 表示開(kāi)啟重用。允許將TIME-WAIT sockets重新用于新的TCP連接,默認(rèn)為0,表示關(guān)閉;
net.ipv4.tcp_tw_recycle = 1 表示開(kāi)啟TCP連接中TIME-WAIT sockets的快速回收,默認(rèn)為0,表示關(guān)閉。
net.ipv4.tcp_fin_timeout 修改系默認(rèn)的 TIMEOUT 時(shí)間/pre
然后執(zhí)行 /sbin/sysctl -p 讓參數(shù)生效.
/etc/sysctl.conf是一個(gè)允許改變正在運(yùn)行中的Linux系統(tǒng)的接口,它包含一些TCP/IP堆棧和虛擬內(nèi)存系統(tǒng)的高級(jí)選項(xiàng),修改內(nèi)核參數(shù)永久生效。
簡(jiǎn)單來(lái)說(shuō),就是打開(kāi)系統(tǒng)的TIMEWAIT重用和快速回收。
本文主要講述了socket的主要api,以及tcp的連接過(guò)程和其中各個(gè)階段的連接狀態(tài),理解這些是更深入了解tcp的基礎(chǔ)!
先進(jìn)防火墻設(shè)置。
1、進(jìn)入防火墻自定義IP規(guī)則,增加規(guī)則;2、輸入名稱、說(shuō)明;3、設(shè)置數(shù)據(jù)包方向和對(duì)方畝敬IP地址;4、設(shè)置TCP本地端李消口443到443,對(duì)方端口0到0,TCP標(biāo)志哪耐知位為SYN,當(dāng)滿足上面條件時(shí)"通行"確定;5、在IP規(guī)則列表中把該規(guī)則上移到TCP協(xié)議的第一條,并選上勾再保存即可。
問(wèn)題一:如何更改云服務(wù)器3389端口 注冊(cè)表有2個(gè)地方需要修改:第一處:[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp]
PortNumber值,默認(rèn)是3389,修改成所希望的端口,比如1314第二處:[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp]
PortNumber值,默認(rèn)是3389,修改成所希望的端口,比如1314
完后重啟服務(wù)器 OK!!
問(wèn)題二:如何修改云服務(wù)器遠(yuǎn)程端口 什么系統(tǒng),Windows系統(tǒng)還是Linux系統(tǒng)? 百度經(jīng)驗(yàn)一般都有的。您直接搜:**系統(tǒng)遠(yuǎn)程端口修改。
問(wèn)題三:怎樣修改云服務(wù)器遠(yuǎn)程桌面鏈接的端口號(hào) 護(hù)衛(wèi)神有個(gè)免費(fèi)的3389端口修改軟件,你可以試試。
問(wèn)題四:阿里云主機(jī)可以修改遠(yuǎn)程連接端口么 如果有后臺(tái)直接在后臺(tái)更改,沒(méi)有后臺(tái)可以在云服務(wù)物賣器遠(yuǎn)程桌面上下載一個(gè)subine text,打開(kāi)對(duì)應(yīng)網(wǎng)頁(yè)文件,把要更改的圖片內(nèi)容替換掉就OK了旁卜2712192471,不懂問(wèn)我
問(wèn)題五:有誰(shuí)知道阿里云服務(wù)器怎樣配置自定義端口的外部訪問(wèn)權(quán)限 阿里云服務(wù)器新系統(tǒng)默認(rèn)是所有端口對(duì)外開(kāi)放的,如有限制請(qǐng)查看防火墻
問(wèn)題六:云服務(wù)器上怎樣做端口映射? 30分 如果不借助第三方軟件,端口映射只能在路由上做,云主機(jī)肯定做不了。
找到nat123端口映射,添加映射就行
問(wèn)題七:想問(wèn)下云端服務(wù)器怎么添加端口 就是SOCKET 的send和recv ,如果用MFC就用CSocket ,要不直接用socket都一樣,包括在linux/UNIX下 !!
問(wèn)題八:騰訊云服務(wù)器端口默認(rèn)是什么??? 一般幾乎所有的服務(wù)器遠(yuǎn)程登錄默認(rèn)端口是3389、ftp默認(rèn)端口是21,其他默認(rèn)端口,可到快云VPS之家查詢相關(guān)內(nèi)容。
問(wèn)題九:有誰(shuí)知道騰訊云的軟件端口怎么去設(shè)置 一般幾乎所有的服務(wù)器遠(yuǎn)程登錄默認(rèn)端口是3389、FTP默認(rèn)端口是21. 我用的是小鳥(niǎo)云服務(wù)器都罩啟逗挺方便的
問(wèn)題十:阿里云服務(wù)器更改端口后死活登錄不上了,防火墻也改了啊,也是登錄不上,最后把防火墻關(guān)了,還是登錄不上 檢查下阿里云控制臺(tái)下的安全組,如果安全組是選擇:默認(rèn)只開(kāi)放3389,正好你又改了3389的話,這樣是連接不上的。
解決方法是,新建一個(gè)安全組策略,加一條規(guī)矩允許你修改的端口通過(guò),把云服務(wù)器關(guān)聯(lián)到這個(gè)安全組里面(把原來(lái)的那個(gè)移除),再次連接服務(wù)器試試看
網(wǎng)站欄目:騰訊云服務(wù)器tcp連接 騰訊云服務(wù)器tcp連接異常
轉(zhuǎn)載源于:http://chinadenli.net/article46/dshoshg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開(kāi)發(fā)、標(biāo)簽優(yōu)化、網(wǎng)站策劃、微信公眾號(hào)、建站公司、Google
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容