在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

socket是什么以及socket的原理和內(nèi)核實(shí)現(xiàn)

小林coding ? 來源:小白debug ? 2023-06-26 14:14 ? 次閱讀

我相信大家剛開始學(xué)socket的時(shí)候,都跟我一樣。

云里霧里的,對socket的概念很模糊。

這篇文章我打算從一個(gè)初學(xué)者的角度開始聊起,讓大家了解下我眼里的socket是什么以及socket的原理和內(nèi)核實(shí)現(xiàn)。

socket的概念

故事要從一個(gè)插頭說起。

插頭與插座

當(dāng)我將插頭插入插座,那看起來就像是將兩者連起來了。

風(fēng)扇與電力系統(tǒng)建立"連接"

而插座的英文,又叫socket。

巧了,我們程序員搞網(wǎng)絡(luò)編程時(shí)也會用到一個(gè)叫socket的東西。

其實(shí)兩者非常相似。通過socket,我們可以與某臺機(jī)子建立"連接",建立"連接"的過程,就像是將插口插入插槽一樣。

大概概念是了解了,但我相信各位對socket其實(shí)還是很模糊。

我們從大家最熟悉的使用場景開始說起。

socket的使用場景

我們想要將數(shù)據(jù)從A電腦的某個(gè)進(jìn)程發(fā)到B電腦的某個(gè)進(jìn)程。

這時(shí)候我們需要選擇將數(shù)據(jù)發(fā)過去的方式,如果需要確保數(shù)據(jù)要能發(fā)給對方,那就選可靠的TCP協(xié)議,如果數(shù)據(jù)丟了也沒關(guān)系,看天意,那就選擇不可靠的UDP協(xié)議。

初學(xué)者毫無疑問,首選TCP。

TCP是什么

那這時(shí)候就需要用socket進(jìn)行編程。

于是第一步就是創(chuàng)建個(gè)關(guān)于TCP的socket。就像下面這樣。

sock_fd=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

這個(gè)方法會返回socket_fd,它是socket文件的句柄,是個(gè)數(shù)字,相當(dāng)于socket的身份證號。

得到了socket_fd之后,對于服務(wù)端,就可以依次執(zhí)行bind(),listen(),accept()方法,然后坐等客戶端的連接請求。

對于客戶端,得到socket_fd之后,你就可以執(zhí)行connect()方法向服務(wù)端發(fā)起建立連接的請求,此時(shí)就會發(fā)生TCP三次握手。

689f3c92-13df-11ee-962d-dac502259ad0.gif

握手建立連接流程

連接建立完成后,客戶端可以執(zhí)行send()方法發(fā)送消息,服務(wù)端可以執(zhí)行recv()方法接收消息,反過來,服務(wù)器也可以執(zhí)行send(),客戶端執(zhí)行recv()方法。

到這里為止,就是我們大部分程序員最熟悉的使用場景。

socket的設(shè)計(jì)

現(xiàn)在,socket我們見過,也用過,但對大部分程序員來說,它是個(gè)黑盒

那既然是黑盒,我們索性假設(shè)我們忘了socket。重新設(shè)計(jì)一個(gè)內(nèi)核網(wǎng)絡(luò)傳輸功能。

網(wǎng)絡(luò)傳輸,從操作上來看,無非就是,發(fā)數(shù)據(jù)和遠(yuǎn)端之間互相收發(fā)數(shù)據(jù)。也就是對應(yīng)著寫數(shù)據(jù)讀數(shù)據(jù)

讀寫收發(fā)

但顯然,事情沒那么簡單。

這里還有兩個(gè)問題。

第一個(gè)是,接收端和發(fā)送端可能不止一個(gè),因此我們需要一些信息做下區(qū)分,這個(gè)大家肯定很熟悉,可以用IP和端口IP用來定位是哪臺電腦,端口用來定位是這臺電腦上的哪個(gè)進(jìn)程。

第二個(gè)是,發(fā)送端和接收端的傳輸方式有很多區(qū)別,可以是可靠的TCP協(xié)議,也可以是不可靠的UDP協(xié)議,甚至還需要支持基于icmp協(xié)議的ping命令。

sock是什么

寫過代碼的都知道,為了支持這些功能,我們需要定義一個(gè)數(shù)據(jù)結(jié)構(gòu)去支持這些功能。

這個(gè)數(shù)據(jù)結(jié)構(gòu),叫sock。

為了解決上面的第一個(gè)問題,我們可以在sock里加入IP和端口字段。

68d34a28-13df-11ee-962d-dac502259ad0.png

sock加入IP和端口字段

而第二個(gè)問題,我們會發(fā)現(xiàn)這些協(xié)議雖然各不相同,但還是有一些功能相似的地方,比如收發(fā)數(shù)據(jù)時(shí)的一些邏輯完全可以復(fù)用。按面向?qū)ο缶幊痰乃枷耄覀兛梢詫⒉煌膮f(xié)議當(dāng)成是不同的對象類(或結(jié)構(gòu)體),將公共的部分提取出來,通過"繼承"的方式,復(fù)用功能。

基于各種sock實(shí)現(xiàn)網(wǎng)絡(luò)傳輸功能

于是,我們將功能重新劃分下,定義了一些數(shù)據(jù)結(jié)構(gòu)。

68df6f60-13df-11ee-962d-dac502259ad0.png

繼承sock的各類sock

sock是最基礎(chǔ)的結(jié)構(gòu),維護(hù)一些任何協(xié)議都有可能會用到的收發(fā)數(shù)據(jù)緩沖區(qū)。

inet_sock特指用了網(wǎng)絡(luò)傳輸功能的sock,在sock的基礎(chǔ)上還加入了TTL,端口,IP地址這些跟網(wǎng)絡(luò)傳輸相關(guān)的字段信息。說到這里大家就懵了,難道還有不是用網(wǎng)絡(luò)傳輸?shù)模坑校热鏤nix domain socket,用于本機(jī)進(jìn)程之間的通信,直接讀寫文件,不需要經(jīng)過網(wǎng)絡(luò)協(xié)議棧。這是個(gè)非常有用的東西,我以后一定講講(畫餅)。

inet_connection_sock是指面向連接的sock,在inet_sock的基礎(chǔ)上加入面向連接的協(xié)議里相關(guān)字段,比如accept隊(duì)列,數(shù)據(jù)包分片大小,握手失敗重試次數(shù)等。雖然我們現(xiàn)在提到面向連接的協(xié)議就是指TCP,但設(shè)計(jì)上linux需要支持?jǐn)U展其他面向連接的新協(xié)議

tcp_sock就是正兒八經(jīng)的tcp協(xié)議專用的sock結(jié)構(gòu)了,在inet_connection_sock基礎(chǔ)上還加入了tcp特有的滑動窗口擁塞避免等功能。同樣udp協(xié)議也會有一個(gè)專用的數(shù)據(jù)結(jié)構(gòu),叫udp_sock。

好了,現(xiàn)在有了這套數(shù)據(jù)結(jié)構(gòu),我們將它們跟硬件網(wǎng)卡對接一下,就實(shí)現(xiàn)了網(wǎng)絡(luò)傳輸?shù)墓δ堋?/p>

提供socket層

可以想象得到,這里面的代碼肯定非常復(fù)雜,同時(shí)還操作了網(wǎng)卡硬件,需要比較高的操作系統(tǒng)權(quán)限,再考慮到性能和安全,于是決定將它放在操作系統(tǒng)內(nèi)核里。

既然網(wǎng)絡(luò)傳輸功能做在內(nèi)核里,那用戶空間的應(yīng)用程序想要用這部分功能的話,該怎么辦呢?

這個(gè)好辦,本著不重復(fù)造輪子的原則,我們將這部分功能抽象成一個(gè)個(gè)簡單的接口。以后別人只需要調(diào)用這些接口,就可以驅(qū)動我們寫好的這一大堆復(fù)雜的數(shù)據(jù)結(jié)構(gòu)去發(fā)送數(shù)據(jù)。

那么問題來了,怎么樣將這部分功能暴露出去呢?讓其他程序員更方便的使用呢?

既然跟遠(yuǎn)端服務(wù)端進(jìn)程收發(fā)數(shù)據(jù)可以抽象為“讀和寫”,操作文件也可以抽象為"讀和寫",正好有句話叫,"linux里一切皆是文件",那我們索性,將內(nèi)核的sock封裝成文件就好了。創(chuàng)建sock的同時(shí)也創(chuàng)建一個(gè)文件文件有個(gè)句柄fd,說白了就是個(gè)文件系統(tǒng)里的身份證號碼,通過它可以唯一確定是哪個(gè)sock。

這個(gè)文件句柄fd其實(shí)就是sock_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)里的sock_fd。

將句柄暴露給用戶,之后用戶就可以像操作文件句柄那樣去操作這個(gè)sock句柄。在用戶空間里操作這個(gè)句柄,文件系統(tǒng)就會將操作指向內(nèi)核sock結(jié)構(gòu)。

是的,操作這個(gè)特殊的文件就相當(dāng)于操作內(nèi)核里對應(yīng)的sock。

68f90786-13df-11ee-962d-dac502259ad0.png

通過文件找到sock

有了sock_fd句柄之后,我們就需要提供一些接口方法,讓用戶更方便的實(shí)現(xiàn)特定的網(wǎng)絡(luò)編程功能。這些接口,我們列了一下,發(fā)現(xiàn)需要有send(),recv(),bind(),listen(),connect()這些。到這里,我們的內(nèi)核網(wǎng)絡(luò)傳輸功能就算設(shè)計(jì)完成了。

現(xiàn)在是不是眼熟了,上面這些接口方法其實(shí)就是socket提供出來的接口

所以說,socket其實(shí)就是個(gè)代碼庫 or 接口層,它介于內(nèi)核和應(yīng)用程序之間,提供了一些高度封裝過的接口,讓我們?nèi)ナ褂?strong>內(nèi)核網(wǎng)絡(luò)傳輸功能。

690a4046-13df-11ee-962d-dac502259ad0.png

基于sock實(shí)現(xiàn)網(wǎng)絡(luò)傳輸功能

到這里,我們應(yīng)該明白了。我們平時(shí)寫的應(yīng)用程序里代碼里雖然用了socket實(shí)現(xiàn)了收發(fā)數(shù)據(jù)包的功能,但其實(shí)真正執(zhí)行網(wǎng)絡(luò)通信功能的,不是應(yīng)用程序,而是linux內(nèi)核。相當(dāng)于應(yīng)用程序通過socket提供的接口,將網(wǎng)絡(luò)傳輸?shù)倪@部分工作外包給了linux內(nèi)核

這聽起來像不像我們最熟悉的前后端分離的服務(wù)架構(gòu),雖然這么說不太嚴(yán)謹(jǐn),但看上去linux就像是被分成了應(yīng)用程序和內(nèi)核兩個(gè)服務(wù)。內(nèi)核就像是后端,暴露了好多個(gè)api接口,其中一類就是socket的send()和recv()這些方法。應(yīng)用程序就像是前端,負(fù)責(zé)調(diào)用內(nèi)核提供的接口來實(shí)現(xiàn)想要的功能。

692b0326-13df-11ee-962d-dac502259ad0.png

進(jìn)程通過socket調(diào)用內(nèi)核功能

看到這里,我擔(dān)心大家會有點(diǎn)混亂,來做個(gè)小的總結(jié)

在操作系統(tǒng)內(nèi)核空間里,實(shí)現(xiàn)網(wǎng)絡(luò)傳輸功能的結(jié)構(gòu)是sock,基于不同的協(xié)議和應(yīng)用場景,會被泛化為各種類型的xx_sock,它們結(jié)合硬件,共同實(shí)現(xiàn)了網(wǎng)絡(luò)傳輸功能。為了將這部分功能暴露給用戶空間的應(yīng)用程序使用,于是引入了socket層,同時(shí)將sock嵌入到文件系統(tǒng)的框架里,sock就變成了一個(gè)特殊的文件,用戶就可以在用戶空間使用文件句柄,也就是socket_fd來操作內(nèi)核sock的網(wǎng)絡(luò)傳輸能力。

這個(gè)socket_fd是一個(gè)int類型的數(shù)字。現(xiàn)在回去看socket的中文翻譯,套接字將它理解為一用于連的數(shù),是不是就覺得特別合理了。

網(wǎng)絡(luò)分層與基于sock實(shí)現(xiàn)網(wǎng)絡(luò)傳輸功能

socket如何實(shí)現(xiàn)網(wǎng)絡(luò)通信

上面關(guān)于怎么實(shí)現(xiàn)網(wǎng)絡(luò)通信功能這一塊一筆帶過了。

現(xiàn)在我們來聊聊。

這套sock的結(jié)構(gòu)其實(shí)非常復(fù)雜。我們以最常用的TCP協(xié)議為例,簡單了解下它是怎么實(shí)現(xiàn)網(wǎng)絡(luò)傳輸功能的。

我將它分為兩階段,分別是建立連接數(shù)據(jù)傳輸

建立連接

對于TCP,要傳數(shù)據(jù),就得先在客戶端和服務(wù)端中間建立連接

在客戶端,代碼執(zhí)行socket提供的connect(sockfd, "ip:port")方法時(shí),會通過sockfd句柄找到對應(yīng)的文件,再根據(jù)文件里的信息指向內(nèi)核的sock結(jié)構(gòu)。通過這個(gè)sock結(jié)構(gòu)主動發(fā)起三次握手。

69592102-13df-11ee-962d-dac502259ad0.png

TCP三次握手

在服務(wù)端握手次數(shù)還沒達(dá)到"三次"的連接,叫半連接,完成好三次握手的連接,叫全連接。它們分別會用半連接隊(duì)列全連接隊(duì)列來存放,這兩個(gè)隊(duì)列會在你執(zhí)行l(wèi)isten()方法的時(shí)候創(chuàng)建好。當(dāng)服務(wù)端執(zhí)行accept()方法時(shí),就會從全連接隊(duì)列里拿出一條全連接。

69733024-13df-11ee-962d-dac502259ad0.png

半連接隊(duì)列和全連接隊(duì)列

至此,連接就算準(zhǔn)備好了,之后,就可以開始傳輸數(shù)據(jù)

雖然都叫隊(duì)列,但半連接隊(duì)列其實(shí)是個(gè)hash表,而全連接隊(duì)列其實(shí)是個(gè)鏈表。

那么問題來了,為什么半連接隊(duì)列要設(shè)計(jì)成哈希表而全連接隊(duì)列是個(gè)鏈表?這個(gè)在我在我之前寫的《沒有accept,能建立TCP連接嗎?》已經(jīng)提到過,不再重復(fù)。

數(shù)據(jù)傳輸

為了實(shí)現(xiàn)發(fā)送和接收數(shù)據(jù)的功能,sock結(jié)構(gòu)體里帶了一個(gè)發(fā)送緩沖區(qū)和一個(gè)接收緩沖區(qū),說是緩沖區(qū),但其實(shí)就是個(gè)鏈表,上面掛著一個(gè)個(gè)準(zhǔn)備要發(fā)送或接收的數(shù)據(jù)。

當(dāng)應(yīng)用執(zhí)行send()方法發(fā)送數(shù)據(jù)時(shí),同樣也會通過sock_fd句柄找到對應(yīng)的文件,根據(jù)文件指向的sock結(jié)構(gòu),找到這個(gè)sock結(jié)構(gòu)里帶的發(fā)送緩沖區(qū),將數(shù)據(jù)會放到發(fā)送緩沖區(qū),然后結(jié)束流程,內(nèi)核看心情決定什么時(shí)候?qū)⑦@份數(shù)據(jù)發(fā)送出去。

接收數(shù)據(jù)流程也類似,當(dāng)數(shù)據(jù)送到linux內(nèi)核后,數(shù)據(jù)不是立馬給到應(yīng)用程序的,而是先放在接收緩沖區(qū)中,數(shù)據(jù)靜靜躺著,卑微的等待應(yīng)用程序什么時(shí)候執(zhí)行recv()方法來拿一下。就像我的文章,躺在你的推文列表里,卑微的等一個(gè)點(diǎn)贊關(guān)注轉(zhuǎn)發(fā)三連。懂?

698cd60a-13df-11ee-962d-dac502259ad0.png

sock的發(fā)送和接收緩沖區(qū)

IP和端口其實(shí)不在sock下,而在inet_sock下,上面這么畫只是為了簡化。。。

那么問題來了,發(fā)送數(shù)據(jù)是應(yīng)用程序主動發(fā)起,這個(gè)大家都沒問題。

那接收數(shù)據(jù)呢?數(shù)據(jù)從遠(yuǎn)端發(fā)過來了,怎么通知并給到應(yīng)用程序呢?

這就需要用到等待隊(duì)列

699b0ef0-13df-11ee-962d-dac502259ad0.png

sock內(nèi)的等待隊(duì)列

當(dāng)你的應(yīng)用進(jìn)程執(zhí)行recv()方法嘗試獲取(阻塞場景下)接收緩沖區(qū)的數(shù)據(jù)時(shí)。

?如果有數(shù)據(jù),那正好,取走就好了。這點(diǎn)沒啥疑問。

?但如果沒數(shù)據(jù),就會將自己的進(jìn)程信息注冊到這個(gè)sock用的等待隊(duì)列里,然后進(jìn)程休眠。如果這時(shí)候有數(shù)據(jù)從遠(yuǎn)端發(fā)過來了,數(shù)據(jù)進(jìn)入到接收緩沖區(qū)時(shí),內(nèi)核就會取出sock的等待隊(duì)列里的進(jìn)程,喚醒進(jìn)程來取數(shù)據(jù)。

69abf06c-13df-11ee-962d-dac502259ad0.png

recv時(shí)無數(shù)據(jù)進(jìn)程進(jìn)入等待隊(duì)列

有時(shí)候,你會看到多個(gè)進(jìn)程通過fork的方式,listen了同一個(gè)socket_fd。在內(nèi)核,它們都是同一個(gè)sock,多個(gè)進(jìn)程執(zhí)行l(wèi)isten()之后,都嗷嗷等待連接進(jìn)來,所以都會將自身的進(jìn)程信息注冊到這個(gè)socket_fd對應(yīng)的內(nèi)核sock的等待隊(duì)列中。如果這時(shí)真來了一個(gè)連接,是該喚醒等待隊(duì)列里的哪個(gè)進(jìn)程來接收連接呢?這個(gè)問題的答案比較有趣。

?在linux 2.6以前,會喚醒等待隊(duì)列里的所有進(jìn)程。但最后其實(shí)只有一個(gè)進(jìn)程會處理這個(gè)連接請求,其他進(jìn)程又重新進(jìn)入休眠,這些被喚醒了又無事可做最后只能重新回去休眠的進(jìn)程會消耗一定的資源。就好像你在廣東的街頭,想問路,叫一聲靚仔,幾十個(gè)人同時(shí)回頭,但你其實(shí)只需要其中一個(gè)靚仔告訴你路該怎么走。你這種一不小心動這靚仔的場景,在計(jì)算機(jī)領(lǐng)域中,就叫驚群效應(yīng)

?在linux 2.6之后,只會喚醒等待隊(duì)列里的其中一個(gè)進(jìn)程。是的,socket監(jiān)聽的驚群效應(yīng)問題被修復(fù)了。

69c78278-13df-11ee-962d-dac502259ad0.png

驚群效應(yīng)

看到這里,問題又來了。

服務(wù)端 listen 的時(shí)候,那么多數(shù)據(jù)到一個(gè) socket 怎么區(qū)分多個(gè)客戶端的?

以TCP為例,服務(wù)端執(zhí)行l(wèi)isten方法后,會等待客戶端發(fā)送數(shù)據(jù)來。客戶端發(fā)來的數(shù)據(jù)包上會有源IP地址和端口,以及目的IP地址和端口,這四個(gè)元素構(gòu)成一個(gè)四元組,可以用于唯一標(biāo)記一個(gè)客戶端。

其實(shí)說四元組并不嚴(yán)謹(jǐn),因?yàn)檫^程中還有很多其他信息,也可以說是五元組。。。但大概理解就好,就這樣吧。。。

69d75554-13df-11ee-962d-dac502259ad0.png

四元組

服務(wù)端會創(chuàng)建一個(gè)新的內(nèi)核sock,并用四元組生成一個(gè)hash key,將它放入到一個(gè)hash表中。

69e8f1ce-13df-11ee-962d-dac502259ad0.png

四元組映射成hash鍵

下次再有消息進(jìn)來的時(shí)候,通過消息自帶的四元組生成hash key再到這個(gè)hash表里重新取出對應(yīng)的sock就好了。所以說服務(wù)端是通過四元組來區(qū)分多個(gè)客戶端的

6a00aaa8-13df-11ee-962d-dac502259ad0.png

多個(gè)hash_key對應(yīng)多個(gè)客戶端

sock怎么實(shí)現(xiàn)"繼承"

最后遺留一個(gè)問題。

大家都知道linux內(nèi)核是C語言實(shí)現(xiàn)的,而C語言沒有類也沒有繼承的特性,是怎么做到"繼承"的效果的呢?

在C語言里,結(jié)構(gòu)體里的內(nèi)存是連續(xù)的,將要繼承的"父類",放到結(jié)構(gòu)體的第一位,就像下面這樣。

structtcp_sock{
/*inet_connection_sockhastobethefirstmemberoftcp_sock*/
structinet_connection_sockinet_conn;
//其他字段
}

structinet_connection_sock{
/*inet_sockhastobethefirstmember!*/
structinet_sockicsk_inet;
//其他字段
}

然后我們就可以通過結(jié)構(gòu)體名的長度來強(qiáng)行截取內(nèi)存,這樣就能轉(zhuǎn)換結(jié)構(gòu)體,從而實(shí)現(xiàn)類似"繼承"的效果。

//sock轉(zhuǎn)為tcp_sock
staticinlinestructtcp_sock*tcp_sk(conststructsock*sk)
{
return(structtcp_sock*)sk;
}
6a0bebc0-13df-11ee-962d-dac502259ad0.png

內(nèi)存布局

總結(jié)

?socket中文套接字,我理解為一用于連的數(shù)。并不一定準(zhǔn)確,歡迎評論。

? sock在內(nèi)核,socket_fd在用戶空間,socket層介于內(nèi)核和用戶空間之間。

?在操作系統(tǒng)內(nèi)核空間里,實(shí)現(xiàn)網(wǎng)絡(luò)傳輸功能的結(jié)構(gòu)是sock,基于不同的協(xié)議和應(yīng)用場景,會被泛化為各種類型的xx_sock,它們結(jié)合硬件,共同實(shí)現(xiàn)了網(wǎng)絡(luò)傳輸功能。為了將這部分功能暴露給用戶空間的應(yīng)用程序使用,于是引入了socket層,同時(shí)將sock嵌入到文件系統(tǒng)的框架里,sock就變成了一個(gè)特殊的文件,用戶就可以在用戶空間使用文件句柄,也就是socket_fd來操作內(nèi)核sock的網(wǎng)絡(luò)傳輸能力。

?服務(wù)端可以通過四元組來區(qū)分多個(gè)客戶端。

?內(nèi)核通過c語言"結(jié)構(gòu)體里的內(nèi)存是連續(xù)的"這一特點(diǎn)實(shí)現(xiàn)了類似繼承的效果。






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • Socket
    +關(guān)注

    關(guān)注

    0

    文章

    212

    瀏覽量

    35391
  • TCP協(xié)議
    +關(guān)注

    關(guān)注

    1

    文章

    101

    瀏覽量

    12287
  • UDP通信
    +關(guān)注

    關(guān)注

    0

    文章

    21

    瀏覽量

    2060

原文標(biāo)題:socket 到底是什么?

文章出處:【微信號:小林coding,微信公眾號:小林coding】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    socket 客戶端與服務(wù)器的實(shí)現(xiàn)

    1. 理解Socket 在計(jì)算機(jī)網(wǎng)絡(luò)中,socket是一種通信機(jī)制,允許兩個(gè)程序(一個(gè)客戶端和一個(gè)服務(wù)器)通過網(wǎng)絡(luò)進(jìn)行通信。在Python中,可以使用 socket 庫來創(chuàng)建和管理sockets
    的頭像 發(fā)表于 11-12 14:30 ?654次閱讀

    socket 和 UDP 協(xié)議的對比

    在現(xiàn)代互聯(lián)網(wǎng)技術(shù)中,數(shù)據(jù)傳輸是核心功能之一。為了實(shí)現(xiàn)這一功能,我們依賴于各種通信協(xié)議和接口。Socket 和 UDP 是兩種廣泛使用的網(wǎng)絡(luò)通信技術(shù),它們在實(shí)現(xiàn)網(wǎng)絡(luò)通信方面各有特點(diǎn)和用途
    的頭像 發(fā)表于 11-12 14:28 ?688次閱讀

    socket 與 RESTful API 的使用

    在現(xiàn)代網(wǎng)絡(luò)應(yīng)用中,數(shù)據(jù)傳輸和通信是核心功能之一。為了實(shí)現(xiàn)這一功能,開發(fā)者通常會使用兩種主流的技術(shù):Socket和RESTful API。 1. Socket的概念和特點(diǎn) 1.1 Socket
    的頭像 發(fā)表于 11-12 14:22 ?630次閱讀

    socket 在物聯(lián)網(wǎng)中的應(yīng)用

    不同的計(jì)算機(jī)程序在網(wǎng)絡(luò)中進(jìn)行通信。它基于TCP/IP協(xié)議,提供了一種可靠的、面向連接的通信方式。在物聯(lián)網(wǎng)中,Socket使得設(shè)備能夠發(fā)送和接收數(shù)據(jù),實(shí)現(xiàn)遠(yuǎn)程控制和監(jiān)控。 2. Socket在物聯(lián)網(wǎng)中的作用 2.1 數(shù)據(jù)傳輸 物聯(lián)
    的頭像 發(fā)表于 11-12 14:19 ?911次閱讀

    socket 加密通信的實(shí)現(xiàn)方式

    在網(wǎng)絡(luò)通信中,數(shù)據(jù)的安全性至關(guān)重要。Socket 編程作為網(wǎng)絡(luò)通信的基礎(chǔ),實(shí)現(xiàn)加密通信是保護(hù)數(shù)據(jù)不被竊取或篡改的重要手段。 1. SSL/TLS 加密 SSL(Secure Socket Layer
    的頭像 發(fā)表于 11-12 14:18 ?1076次閱讀

    socket 連接超時(shí)處理技巧

    在網(wǎng)絡(luò)編程中,Socket連接超時(shí)是一個(gè)常見的問題。處理超時(shí)的關(guān)鍵在于確保程序能夠優(yōu)雅地處理這些情況,避免程序崩潰或者無響應(yīng)。以下是一些處理Socket連接超時(shí)的技巧。 1. 設(shè)置合理的超時(shí)
    的頭像 發(fā)表于 11-12 14:13 ?960次閱讀

    socket 與 HTTP 協(xié)議的關(guān)系

    服務(wù)器)通過網(wǎng)絡(luò)進(jìn)行通信。Socket是操作系統(tǒng)提供的接口,用于實(shí)現(xiàn)進(jìn)程間的通信。在網(wǎng)絡(luò)通信中,Socket可以跨越不同的計(jì)算機(jī)和操作系統(tǒng),實(shí)現(xiàn)數(shù)據(jù)的傳輸。
    的頭像 發(fā)表于 11-12 14:12 ?575次閱讀

    socket 發(fā)送和接收數(shù)據(jù)方法

    1. Socket 基本概念 在網(wǎng)絡(luò)編程中,socket 是一個(gè)通信端點(diǎn)。它允許程序發(fā)送和接收數(shù)據(jù)。根據(jù)通信協(xié)議的不同,socket 可以分為以下幾種類型: 流式 socket
    的頭像 發(fā)表于 11-12 14:07 ?1491次閱讀

    socket 編程基礎(chǔ)入門

    Socket 編程基礎(chǔ)入門 在計(jì)算機(jī)網(wǎng)絡(luò)中,Socket 是一個(gè)抽象層,它將網(wǎng)絡(luò)通信的細(xì)節(jié)隱藏起來,為開發(fā)者提供了一個(gè)簡單的接口來發(fā)送和接收數(shù)據(jù)。Socket 編程是網(wǎng)絡(luò)編程的基礎(chǔ),它允許程序之間
    的頭像 發(fā)表于 11-12 14:03 ?737次閱讀

    C語言中的socket編程基礎(chǔ)

    Socket編程簡介 Socket是一種通信機(jī)制,允許程序之間進(jìn)行通信。在C語言中,socket編程是網(wǎng)絡(luò)編程的基礎(chǔ)。通過使用socket,程序可以發(fā)送和接收數(shù)據(jù),
    的頭像 發(fā)表于 11-01 16:51 ?853次閱讀

    socket連接超時(shí)如何處理

    實(shí)現(xiàn)以及網(wǎng)絡(luò)環(huán)境。 1. 理解Socket連接超時(shí) 在TCP/IP協(xié)議中,socket連接超時(shí)通常指的是在建立連接、發(fā)送數(shù)據(jù)或接收數(shù)據(jù)的過程中,由于沒有在預(yù)期時(shí)間內(nèi)完成操作,系統(tǒng)自動終止連接。這個(gè)預(yù)期時(shí)間就是超時(shí)時(shí)間(timeo
    的頭像 發(fā)表于 11-01 16:48 ?1809次閱讀

    如何在Python中使用socket

    1. 基本概念 在開始使用socket之前,我們需要了解一些基本的網(wǎng)絡(luò)通信概念: IP地址 :用于標(biāo)識網(wǎng)絡(luò)上的設(shè)備。 端口 :用于標(biāo)識設(shè)備上的特定服務(wù)。 協(xié)議 :用于規(guī)定數(shù)據(jù)傳輸?shù)囊?guī)則,如TCP
    的頭像 發(fā)表于 11-01 16:10 ?525次閱讀

    什么是socket編程 socket與tcp/ip協(xié)議的關(guān)系

    什么是Socket編程 Socket編程是一種網(wǎng)絡(luò)編程技術(shù),它允許程序之間進(jìn)行通信。在計(jì)算機(jī)科學(xué)中,socket是一個(gè)抽象的概念,它代表了兩個(gè)應(yīng)用程序之間的一個(gè)通信端點(diǎn)。Socket
    的頭像 發(fā)表于 11-01 16:01 ?878次閱讀

    socket的基本概念和原理

    Socket是一種通信協(xié)議,用于在網(wǎng)絡(luò)中實(shí)現(xiàn)進(jìn)程間的通信。它是一種抽象的編程接口,允許應(yīng)用程序通過網(wǎng)絡(luò)發(fā)送和接收數(shù)據(jù)。 1. 什么是SocketSocket是一種端點(diǎn),用于在網(wǎng)絡(luò)中
    的頭像 發(fā)表于 08-16 10:51 ?2304次閱讀

    如何理解socket編程接口

    不同計(jì)算機(jī)之間進(jìn)行通信的方法。在網(wǎng)絡(luò)編程中,Socket被廣泛用于實(shí)現(xiàn)客戶端和服務(wù)器之間的通信。 1.2 Socket的分類 根據(jù)通信方式的不同,Socket可以分為兩大類:流式
    的頭像 發(fā)表于 08-16 10:48 ?722次閱讀
    主站蜘蛛池模板: 五月天狠狠 | 亚洲精品午夜视频 | 精品国产高清在线看国产 | 成人亚洲电影 | 亚洲毛片儿 | 69日本xxxxhd | 清纯漂亮小美女准备啪啪 | 天天综合天天做 | 人阁色第四影院在线观看 | 天天干天天射天天插 | 久久精品亚洲 | 色天天天天 | 99久久99久久 | 亚洲精品蜜桃久久久久久 | 日产精品卡二卡三卡四卡无卡乱码 | 伊人精品网 | 免费人成在线观看视频播放 | 欧美成人h精品网站 | 欧美黄色一级片视频 | 亚洲高清免费 | 日日夜夜2017 | 亚洲一区二区三区在线播放 | 日本高清色视频在线观看免费 | 亚洲www网站| 在线看免费 | 手机看片日韩高清1024 | 麻生希痴汉电车avop130 | 国产成人一级片 | 免费xxxx大片 | 四虎在线最新永久免费 | 97大香伊在人人线色 | 97av在线视频| 男女交性视频免费播放 | 美女网站在线观看视频18 | 国产福利午夜自产拍视频在线 | www.4hu影院| 亚洲大胆精品337p色 | 亚洲精品成人a在线观看 | 老师叫我揉她内裤越快越好 | 伊人丁香婷婷综合一区二区 | 黄色大片视频在线观看 |