摘要:套接字是全雙工的。做兩件事將未鏈接的套接字轉換為被動套接字,指示內核接受對此套接字的連接請求制定了內核為此套接口排隊的最大連接個數對于指定的套接字,內核要維護未連接隊列和已連接隊列兩個隊列,完成三路握手的連接將從未連接隊列移至已連接隊列。
基礎
一個套接字由相關五元組構成,協議、本地地址、本地端口、遠程地址、遠程端口。
套接字是全雙工的。
只用于tcp,listen的原型是def listen(self, backlog),backlog一般默認為5,但是可以人為調整,一些web服務器都會高于此值。listen做兩件事:
將未鏈接的套接字轉換為被動套接字,指示內核接受對此套接字的連接請求
制定了內核為此套接口排隊的最大連接個數
對于指定的套接字,內核要維護未連接隊列和已連接隊列兩個隊列,完成三路握手的連接將從未連接隊列移至已連接隊列。accept時會從已連接隊列中取出一個給當前進程,若隊列為空則睡眠(表征了其事件驅動的特性)
backlog為兩個隊列和的最大值,超過此值將忽略新來的連接并且不發RST,以使客戶端重發SYN,讓TCP的重傳機制進行重傳。
backlog為0表示不限制連接數,可能會導致SYN Flooding,不建議使用該值
socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
可以用于以下四種情況:
當有一個有相同本地地址和端口的socket1處于TIME_WAIT狀態時,而你啟動的程序的socket2要占用該地址和端口,你的程序就要用到該選項。
SO_REUSEADDR允許同一port上啟動同一服務器的多個實例(多個進程)。但每個實例綁定的IP地址是不能相同的。在有多塊網卡或用IP Alias技術的機器可以測試這種情況。
SO_REUSEADDR允許單個進程綁定相同的端口到多個socket上,但每個socket綁定的ip地址不同。這和2很相似,區別請看UNPv1。
SO_REUSEADDR允許完全相同的地址和端口的重復綁定。但這只用于UDP的多播,不用于TCP
將監聽的連接設置為可重用,這個選項有一些很實用的功能:
防止重啟監聽程序時出現無法bind端口錯誤
實現TCP的NAT穿透
TCP粘包處理與UDP不同,TCP是流協議,而流是連續不斷沒有界限的,使用TCP時需要自己處理分包。由于網絡情況或者發送問題,有可能接收到包的順序和發送的順序不同,這時候就需要用一些方法去進行粘包處理。
比如,為了防止緩沖區等待造成的粘包,可以將使用sendall函數將數據立即發送而不是等待緩沖區滿,并將socket設置為NODELAY
sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
粘包問題其實是如何TCP數據消息邊界的問題,總的來說有3種解決方案:
發送固定長度的消息
把消息的尺寸與消息一塊發送
使用特殊標記來區分消息間隔
第二種情況應該是用得最普遍的,實現比較簡單,也不會對性能造成大的影響。
http協議中基本三種方式都用到了,如圖
http頭部使用CRLF,也就是"回車換行"來區分頭部之間的不同字段,使用消息體尺寸來分割http消息體的內容,使用EOF(ascii為255)來關閉連接。頭部和消息體之間呢?使用兩個CRLF來區分
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/37692.html
摘要:博客寫得差不多了,打算部署到云上因為速度的關系,不打算部署在上,于是申請了阿里云,環境是上篇文章提到的位安裝和配置好和,又稍微了解點服務器的知識后,打算按這里的方法進行部署,思路是用當應用容器,當反向代理安裝安裝非常簡單,一條命令就解決了測 博客寫得差不多了,打算部署到云上因為速度的關系,不打算部署在AWS上,于是申請了阿里云,環境是上篇文章提到的CentOS 7 64位安裝和配置好P...
摘要:出于安全考慮,一般系統上不會直接使用用戶。因此,更好地做法是將需要使用的用戶加入用戶組。建立組將當前用戶加入組退出當前終端并重新登錄,進行如下測試。無需使用管理員權限測試運行運行列出鏡像倉庫名標簽鏡像創建時間占用空間 CentOS 7 安裝 Docker CE 1. docker安裝步驟(基于yum方式) 1.1 查看當前linux內核版本 uname -r #linux內核要求3.1...
摘要:某進程內的線程在其它進程不可見。線程的實體包括程序數據和。包括以下信息線程狀態。當線程不運行時,被保存的現場資源。用戶級線程執行系統調用指令時將導致其所屬進程被中斷,而內核支持線程執行系統調用指令時,只導致該線程被中斷。線程能夠利用的表空 操作系統線程理論 線程概念的引入背景 進程之前我們已經了解了操作系統中進程的概念,程序并不能單獨運行,只有將程序裝載到內存中,系統為它分配資源才能運...
摘要:個高級多線程面試題及回答后端掘金在任何面試當中多線程和并發方面的問題都是必不可少的一部分。目前在生產環基于的技術問答網站系統實現后端掘金這一篇博客將詳細介紹一個基于的問答網站的實現,有詳細的代碼。 15 個高級 Java 多線程面試題及回答 - 后端 - 掘金在任何Java面試當中多線程和并發方面的問題都是必不可少的一部分。如果你想獲得任何股票投資銀行的前臺資訊職位,那么你應該準備很多...
閱讀 1558·2021-09-22 15:52
閱讀 3469·2021-09-22 14:59
閱讀 2848·2021-09-02 15:12
閱讀 977·2021-08-20 09:35
閱讀 1581·2019-08-30 14:09
閱讀 2714·2019-08-30 13:56
閱讀 1653·2019-08-26 18:27
閱讀 3368·2019-08-26 13:37