成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

python socket筆記

everfly / 2711人閱讀

摘要:套接字是全雙工的。做兩件事將未鏈接的套接字轉(zhuǎn)換為被動套接字,指示內(nèi)核接受對此套接字的連接請求制定了內(nèi)核為此套接口排隊的最大連接個數(shù)對于指定的套接字,內(nèi)核要維護未連接隊列和已連接隊列兩個隊列,完成三路握手的連接將從未連接隊列移至已連接隊列。

基礎(chǔ)

一個套接字由相關(guān)五元組構(gòu)成,協(xié)議、本地地址、本地端口、遠程地址、遠程端口。
套接字是全雙工的。

listen函數(shù)

只用于tcp,listen的原型是def listen(self, backlog),backlog一般默認為5,但是可以人為調(diào)整,一些web服務(wù)器都會高于此值。listen做兩件事:

將未鏈接的套接字轉(zhuǎn)換為被動套接字,指示內(nèi)核接受對此套接字的連接請求

制定了內(nèi)核為此套接口排隊的最大連接個數(shù)

對于指定的套接字,內(nèi)核要維護未連接隊列和已連接隊列兩個隊列,完成三路握手的連接將從未連接隊列移至已連接隊列。accept時會從已連接隊列中取出一個給當(dāng)前進程,若隊列為空則睡眠(表征了其事件驅(qū)動的特性)
backlog為兩個隊列和的最大值,超過此值將忽略新來的連接并且不發(fā)RST,以使客戶端重發(fā)SYN,讓TCP的重傳機制進行重傳。
backlog為0表示不限制連接數(shù),可能會導(dǎo)致SYN Flooding,不建議使用該值

socket.SO_REUSEADDR
socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

可以用于以下四種情況:

當(dāng)有一個有相同本地地址和端口的socket1處于TIME_WAIT狀態(tài)時,而你啟動的程序的socket2要占用該地址和端口,你的程序就要用到該選項。

SO_REUSEADDR允許同一port上啟動同一服務(wù)器的多個實例(多個進程)。但每個實例綁定的IP地址是不能相同的。在有多塊網(wǎng)卡或用IP Alias技術(shù)的機器可以測試這種情況。

SO_REUSEADDR允許單個進程綁定相同的端口到多個socket上,但每個socket綁定的ip地址不同。這和2很相似,區(qū)別請看UNPv1。

SO_REUSEADDR允許完全相同的地址和端口的重復(fù)綁定。但這只用于UDP的多播,不用于TCP

將監(jiān)聽的連接設(shè)置為可重用,這個選項有一些很實用的功能:

防止重啟監(jiān)聽程序時出現(xiàn)無法bind端口錯誤

實現(xiàn)TCP的NAT穿透

TCP粘包處理

與UDP不同,TCP是流協(xié)議,而流是連續(xù)不斷沒有界限的,使用TCP時需要自己處理分包。由于網(wǎng)絡(luò)情況或者發(fā)送問題,有可能接收到包的順序和發(fā)送的順序不同,這時候就需要用一些方法去進行粘包處理。

比如,為了防止緩沖區(qū)等待造成的粘包,可以將使用sendall函數(shù)將數(shù)據(jù)立即發(fā)送而不是等待緩沖區(qū)滿,并將socket設(shè)置為NODELAY

sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)

粘包問題其實是如何TCP數(shù)據(jù)消息邊界的問題,總的來說有3種解決方案:

發(fā)送固定長度的消息

把消息的尺寸與消息一塊發(fā)送

使用特殊標(biāo)記來區(qū)分消息間隔

第二種情況應(yīng)該是用得最普遍的,實現(xiàn)比較簡單,也不會對性能造成大的影響。

http協(xié)議中基本三種方式都用到了,如圖

http頭部使用CRLF,也就是"回車換行"來區(qū)分頭部之間的不同字段,使用消息體尺寸來分割http消息體的內(nèi)容,使用EOF(ascii為255)來關(guān)閉連接。頭部和消息體之間呢?使用兩個CRLF來區(qū)分

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/37692.html

相關(guān)文章

  • 安裝配置gunicorn和NGINX的學(xué)習(xí)筆記

    摘要:博客寫得差不多了,打算部署到云上因為速度的關(guān)系,不打算部署在上,于是申請了阿里云,環(huán)境是上篇文章提到的位安裝和配置好和,又稍微了解點服務(wù)器的知識后,打算按這里的方法進行部署,思路是用當(dāng)應(yīng)用容器,當(dāng)反向代理安裝安裝非常簡單,一條命令就解決了測 博客寫得差不多了,打算部署到云上因為速度的關(guān)系,不打算部署在AWS上,于是申請了阿里云,環(huán)境是上篇文章提到的CentOS 7 64位安裝和配置好P...

    Ali_ 評論0 收藏0
  • 一、docker安裝筆記

    摘要:出于安全考慮,一般系統(tǒng)上不會直接使用用戶。因此,更好地做法是將需要使用的用戶加入用戶組。建立組將當(dāng)前用戶加入組退出當(dāng)前終端并重新登錄,進行如下測試。無需使用管理員權(quán)限測試運行運行列出鏡像倉庫名標(biāo)簽鏡像創(chuàng)建時間占用空間 CentOS 7 安裝 Docker CE 1. docker安裝步驟(基于yum方式) 1.1 查看當(dāng)前l(fā)inux內(nèi)核版本 uname -r #linux內(nèi)核要求3.1...

    JerryWangSAP 評論0 收藏0
  • python---線程

    摘要:某進程內(nèi)的線程在其它進程不可見。線程的實體包括程序數(shù)據(jù)和。包括以下信息線程狀態(tài)。當(dāng)線程不運行時,被保存的現(xiàn)場資源。用戶級線程執(zhí)行系統(tǒng)調(diào)用指令時將導(dǎo)致其所屬進程被中斷,而內(nèi)核支持線程執(zhí)行系統(tǒng)調(diào)用指令時,只導(dǎo)致該線程被中斷。線程能夠利用的表空 操作系統(tǒng)線程理論 線程概念的引入背景 進程之前我們已經(jīng)了解了操作系統(tǒng)中進程的概念,程序并不能單獨運行,只有將程序裝載到內(nèi)存中,系統(tǒng)為它分配資源才能運...

    Yangyang 評論0 收藏0
  • 網(wǎng)絡(luò)編程 - 收藏集 - 掘金

    摘要:個高級多線程面試題及回答后端掘金在任何面試當(dāng)中多線程和并發(fā)方面的問題都是必不可少的一部分。目前在生產(chǎn)環(huán)基于的技術(shù)問答網(wǎng)站系統(tǒng)實現(xiàn)后端掘金這一篇博客將詳細介紹一個基于的問答網(wǎng)站的實現(xiàn),有詳細的代碼。 15 個高級 Java 多線程面試題及回答 - 后端 - 掘金在任何Java面試當(dāng)中多線程和并發(fā)方面的問題都是必不可少的一部分。如果你想獲得任何股票投資銀行的前臺資訊職位,那么你應(yīng)該準(zhǔn)備很多...

    justCoding 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<