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