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

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

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

談?wù)勔粋€(gè)字符的網(wǎng)路旅程

馬哥Linux運(yùn)維 ? 來源:CSDN ? 2023-07-31 09:57 ? 次閱讀

我們開發(fā)的面向普通用戶的應(yīng)用程序,目前看來幾乎都是互聯(lián)網(wǎng)應(yīng)用程序,也就是說,用戶操作的應(yīng)用程序,不管是瀏覽器還是移動(dòng)App,核心請(qǐng)求都會(huì)通過互聯(lián)網(wǎng)發(fā)送到后端的數(shù)據(jù)中心進(jìn)行處理。這個(gè)數(shù)據(jù)中心可能是像微信這樣的自己建設(shè)的、在多個(gè)地區(qū)部署的大規(guī)模機(jī)房,也可能是阿里云這樣的云服務(wù)商提供的一個(gè)虛擬主機(jī)。

但是不管這個(gè)數(shù)據(jù)中心的大小,應(yīng)用程序都需要在運(yùn)行期和數(shù)據(jù)中心交互。比如我們?cè)谔詫毜乃阉骺螂S便輸入一個(gè)字符“a”,就會(huì)在屏幕上看到一大堆商品。那么我們的手機(jī)是如何通過互聯(lián)網(wǎng)完成這一操作的?這個(gè)字符如何穿越遙遠(yuǎn)的空間,從手機(jī)發(fā)送到淘寶的數(shù)據(jù)中心,在淘寶計(jì)算得到相關(guān)的結(jié)果,然后將結(jié)果再返回到我們的手機(jī)上,從而完成自己的互聯(lián)網(wǎng)之旅呢?

雖然我們?cè)?a href="http://srfitnesspt.com/v/tag/1315/" target="_blank">編程的時(shí)候,很少要自己直接開發(fā)網(wǎng)絡(luò)通信代碼,服務(wù)器由Tomcat這樣的WEB容器管理網(wǎng)絡(luò)通信,服務(wù)間網(wǎng)絡(luò)通信通過Dubbo這樣的分布式服務(wù)框架完成網(wǎng)絡(luò)通信。但是由于我們現(xiàn)在開發(fā)的應(yīng)用主要是互聯(lián)網(wǎng)應(yīng)用,它們構(gòu)建在網(wǎng)絡(luò)通信基礎(chǔ)上,網(wǎng)絡(luò)通信的問題可能會(huì)出現(xiàn)在系統(tǒng)運(yùn)行的任何時(shí)刻。了解網(wǎng)絡(luò)通信原理,了解互聯(lián)網(wǎng)應(yīng)用如何跨越龐大的網(wǎng)絡(luò)構(gòu)建起來,對(duì)我們開發(fā)一個(gè)互聯(lián)網(wǎng)應(yīng)用系統(tǒng)很有幫助,對(duì)我們解決系統(tǒng)運(yùn)行過程中各種因?yàn)榫W(wǎng)絡(luò)通信而出現(xiàn)的各種問題更有幫助。

DNS

我們先從DNS說起。

構(gòu)成互聯(lián)網(wǎng)Internet的最基本的網(wǎng)絡(luò)協(xié)議就是互聯(lián)網(wǎng)協(xié)議Internet Protocol,簡(jiǎn)稱IP協(xié)議。IP協(xié)議里面最重要的部分是IP地址,各種計(jì)算機(jī)設(shè)備之間能夠互相通信,首先要能夠找到彼此,IP地址就是互聯(lián)網(wǎng)的地址標(biāo)識(shí)。手機(jī)上的淘寶App能夠訪問淘寶的數(shù)據(jù)中心,就是知道了淘寶數(shù)據(jù)中心負(fù)責(zé)請(qǐng)求接入的服務(wù)器的IP地址,然后建立網(wǎng)絡(luò)連接,進(jìn)而處理請(qǐng)求數(shù)據(jù)。

那么手機(jī)上的淘寶App如何知道數(shù)據(jù)中心服務(wù)器的IP地址呢?當(dāng)然淘寶的工程師可以在App里寫死這個(gè)IP地址,但是這樣做會(huì)帶來很多問題,比如影響編程的靈活性以及程序的可用性等。

事實(shí)上這個(gè)IP地址是通過DNS域名解析服務(wù)器得到的。當(dāng)我們打開淘寶App的時(shí)候,淘寶要把App首頁(yè)加載進(jìn)來,這時(shí)候就需要連接域名服務(wù)器進(jìn)行域名解析,將xxx.taobao.com這樣的域名解析為一個(gè)IP地址,然后連接目標(biāo)服務(wù)器。

c337e56c-2ee4-11ee-815d-dac502259ad0.png

CDN

事實(shí)上DNS解析出來的IP地址,并不一定是淘寶數(shù)據(jù)中心的IP地址,也可能是淘寶CDN服務(wù)器的IP地址。

CDN是內(nèi)容分發(fā)網(wǎng)絡(luò)Content Delivery Network的縮寫。我們能夠用手機(jī)或者電腦上網(wǎng),是因?yàn)檫\(yùn)營(yíng)服務(wù)商為我們提供了互聯(lián)網(wǎng)接入服務(wù),將我們的手機(jī)和電腦連接到互聯(lián)網(wǎng)上。App請(qǐng)求的數(shù)據(jù)最先到達(dá)的是運(yùn)營(yíng)服務(wù)商的機(jī)房,然后運(yùn)營(yíng)商通過自己建設(shè)的骨干網(wǎng)絡(luò)和交換節(jié)點(diǎn),將我們請(qǐng)求數(shù)據(jù)的目的地址發(fā)往互聯(lián)網(wǎng)的任何地方。

為了提高用戶請(qǐng)求訪問的速度,也為了降低數(shù)據(jù)中心的負(fù)載壓力,淘寶會(huì)在全國(guó)各地各個(gè)主要的運(yùn)營(yíng)服務(wù)商的接入機(jī)房中部署一些緩存服務(wù)器,緩存那些靜態(tài)的圖片、資源文件等,這些緩存服務(wù)器構(gòu)成了淘寶的CDN。

如果用戶請(qǐng)求的數(shù)據(jù)數(shù)據(jù)是靜態(tài)的資源,這些資源的URL通常以image.taobao.com之類的二級(jí)域名進(jìn)行標(biāo)識(shí),域名解析的時(shí)候就會(huì)解析為淘寶CDN的IP地址,請(qǐng)求先被CDN處理,如果CDN中有需要的靜態(tài)文件,就直接返回,如果沒有,CDN會(huì)將請(qǐng)求發(fā)送到淘寶的數(shù)據(jù)中心,CDN從淘寶數(shù)據(jù)中心獲得靜態(tài)文件后,一方面緩存在自己的服務(wù)器上,一方面將數(shù)據(jù)返回給用戶的App。

c33e3b9c-2ee4-11ee-815d-dac502259ad0.png

而如果請(qǐng)求的數(shù)據(jù)是動(dòng)態(tài)的,比如要搜索關(guān)鍵詞為“a”的商品列表,請(qǐng)求的域名可能會(huì)是search.taobao.com這樣的二級(jí)域名,就會(huì)直接被DNS解析為淘寶的數(shù)據(jù)中心的服務(wù)器IP地址,App請(qǐng)求發(fā)送到數(shù)據(jù)中心處理。

HTTP

不管發(fā)送到CDN還是數(shù)據(jù)中心,App請(qǐng)求都會(huì)以HTTP協(xié)議發(fā)送。

HTTP是一個(gè)應(yīng)用層協(xié)議,當(dāng)我們進(jìn)行網(wǎng)絡(luò)通信編程的時(shí)候,通常需要關(guān)注兩方面的內(nèi)容,一方面是應(yīng)用層的通信協(xié)議,主要是我們通信的數(shù)據(jù)如何編碼,既能使網(wǎng)絡(luò)傳輸過去的數(shù)據(jù)攜帶必要的信息,又使通信的兩方都能正確識(shí)別這些數(shù)據(jù),即通信雙方應(yīng)用程序需要約定一個(gè)數(shù)據(jù)編碼協(xié)議。另一方面就是網(wǎng)絡(luò)底層通信協(xié)議,即如何為網(wǎng)絡(luò)上需要通信的兩個(gè)節(jié)點(diǎn)建立連接完成數(shù)據(jù)傳輸,目前互聯(lián)網(wǎng)應(yīng)用中最主要的就是TCP協(xié)議。

在TCP傳輸層協(xié)議層面,就是保證建立通信兩方的穩(wěn)定通信連接,將一方的數(shù)據(jù)以bit流的方式源源不斷地發(fā)送到另一方,至于這些數(shù)據(jù)代表什么意思,哪里是兩次請(qǐng)求的分界點(diǎn),TCP協(xié)議統(tǒng)統(tǒng)不管,需要應(yīng)用層面自己解決。如果我們基于TCP協(xié)議自己開發(fā)應(yīng)用程序,就必須解決這些問題。而互聯(lián)網(wǎng)應(yīng)用需要在全球范圍為用戶提供服務(wù),將全球的應(yīng)用和全球的用戶聯(lián)系在一起,需要一個(gè)統(tǒng)一的應(yīng)用層協(xié)議,這個(gè)協(xié)議就是HTTP協(xié)議。

c35eae54-2ee4-11ee-815d-dac502259ad0.png

這張圖是HTTP的請(qǐng)求頭的例子,包括請(qǐng)求方法和請(qǐng)求頭參數(shù)。請(qǐng)求方法主要有GET、POST,這是我們最常用的兩種,此外還有DELETE、PUT、HEAD、TRACE等幾種方法;請(qǐng)求頭參數(shù)包括緩存控制Cache-Control、響應(yīng)過期時(shí)間Expires、Cookie等等。

HTTP請(qǐng)求如果是GET方法,那么就只有請(qǐng)求頭;如果是POST方法,在請(qǐng)求頭之后還有一個(gè)body部分,包含請(qǐng)求提交的內(nèi)容,HTTP會(huì)在請(qǐng)求頭的Content-Length參數(shù)聲明body的長(zhǎng)度。

c383d8aa-2ee4-11ee-815d-dac502259ad0.png

這是HTTP響應(yīng)頭的例子,響應(yīng)頭和請(qǐng)求頭一樣包含各種參數(shù),而status狀態(tài)碼聲明響應(yīng)狀態(tài),狀態(tài)碼是200,表示響應(yīng)正常。

響應(yīng)狀態(tài)碼是3XX,表示請(qǐng)求被重定向,常用的302,表示請(qǐng)求被臨時(shí)重定向到新的URL,響應(yīng)頭中包含新的臨時(shí)URL,客戶端收到響應(yīng)后,重新請(qǐng)求這個(gè)新的URL;狀態(tài)碼是4XX,表示客戶端錯(cuò)誤,常見的403,表示請(qǐng)求未授權(quán),被禁止訪問,404表示請(qǐng)求的頁(yè)面不存在;狀態(tài)碼是5XX,表示服務(wù)器異常,常見的500請(qǐng)求未完成,502請(qǐng)求處理超時(shí),503服務(wù)器過載。

如果響應(yīng)正常,那么在響應(yīng)頭之后就是響應(yīng)body,瀏覽器的響應(yīng)body通常是一個(gè)HTML頁(yè)面,App的響應(yīng)body通常是個(gè)JSON字符串。

TCP

應(yīng)用程序使用操作系統(tǒng)的socket接口進(jìn)行網(wǎng)絡(luò)編程,socket里封裝了TCP協(xié)議。應(yīng)用程序通過socket接口使用TCP協(xié)議完成網(wǎng)絡(luò)編程,socket或者TCP在應(yīng)用程序看就是一個(gè)底層通信協(xié)議,事實(shí)上,TCP僅僅是一個(gè)傳輸層協(xié)議,在傳輸層協(xié)議之下,還有網(wǎng)絡(luò)層協(xié)議,網(wǎng)絡(luò)層協(xié)議之下還有數(shù)據(jù)鏈路層協(xié)議,數(shù)據(jù)鏈路層協(xié)議之下還有物理層協(xié)議。

c3b17260-2ee4-11ee-815d-dac502259ad0.png

傳輸層協(xié)議TCP和網(wǎng)絡(luò)層協(xié)議IP共同構(gòu)成TCP/IP協(xié)議棧,成為互聯(lián)網(wǎng)應(yīng)用開發(fā)最主要的通信協(xié)議。OSI開放系統(tǒng)互聯(lián)模型將網(wǎng)絡(luò)協(xié)議定義了7層,TCP/IP協(xié)議棧將OSI頂部三層協(xié)議應(yīng)用層、表示層、會(huì)話層合并為一個(gè)應(yīng)用層,HTTP協(xié)議就是TCP/IP協(xié)議棧中的應(yīng)用層協(xié)議。

物理層負(fù)責(zé)數(shù)據(jù)的物理傳輸,計(jì)算機(jī)輸入輸出的只能是0 1這樣的二進(jìn)制數(shù)據(jù),但是在真正的通信線路里有光纖、電纜、無線各種設(shè)備。光信號(hào)和電信號(hào),以及無線電磁信號(hào)在物理上是完全不同的,如何讓這些不同的設(shè)備能夠理解、處理相同的二進(jìn)制數(shù)據(jù),這就是物理層要解決的問題。

數(shù)據(jù)鏈路層就是將數(shù)據(jù)進(jìn)行封裝后交給物理層進(jìn)行傳輸,主要就是將數(shù)據(jù)封裝成數(shù)據(jù)幀,以幀為單位通過物理層進(jìn)行通信,有了幀,就可以在幀上進(jìn)行數(shù)據(jù)校驗(yàn),進(jìn)行流量控制。數(shù)據(jù)鏈路層會(huì)定義幀的大小,這個(gè)大小也被稱為最大傳輸單元。

像HTTP要在傳輸?shù)臄?shù)據(jù)上添加一個(gè)HTTP頭一樣,數(shù)據(jù)鏈路層也會(huì)將封裝好的幀添加一個(gè)幀頭,幀頭里記錄的一個(gè)重要信息就是發(fā)送者和接受者的mac地址。mac地址是網(wǎng)卡的設(shè)備標(biāo)識(shí)符,是唯一的,數(shù)據(jù)幀通過這個(gè)信息確保數(shù)據(jù)送達(dá)到正確的目標(biāo)機(jī)器。

前面已經(jīng)提到,網(wǎng)絡(luò)層IP協(xié)議使得互聯(lián)網(wǎng)應(yīng)用根據(jù)IP地址就能訪問到淘寶的數(shù)據(jù)中心,請(qǐng)求離開App后,到達(dá)運(yùn)營(yíng)服務(wù)商的交換機(jī),交換機(jī)會(huì)根據(jù)這個(gè)IP地址進(jìn)行路由轉(zhuǎn)發(fā),可能中間會(huì)經(jīng)過很多個(gè)轉(zhuǎn)發(fā)節(jié)點(diǎn),最后數(shù)據(jù)到達(dá)淘寶的服務(wù)器。

網(wǎng)絡(luò)層的數(shù)據(jù)需要交給鏈路層進(jìn)行處理,而鏈路層幀的大小定義了最大傳輸單元,網(wǎng)絡(luò)層的IP數(shù)據(jù)包必須要小于最大傳輸單元才能進(jìn)行網(wǎng)絡(luò)傳輸,這個(gè)數(shù)據(jù)包也有一個(gè)IP頭,主要包括的就是發(fā)送者和接受者的IP地址。

IP協(xié)議不是一個(gè)可靠的通信協(xié)議,并不會(huì)確保數(shù)據(jù)一定送達(dá)。要保證通信的穩(wěn)定可靠,需要傳輸層協(xié)議TCP。TCP協(xié)議在傳輸正式數(shù)據(jù)前,會(huì)先建立連接,這就是著名的TCP三次握手。

c3cb953c-2ee4-11ee-815d-dac502259ad0.png

App和服務(wù)器之間發(fā)送三次報(bào)文才會(huì)建立一個(gè)TCP連接,報(bào)文中的SYN表示請(qǐng)求建立連接,ACK表示確認(rèn)。App先發(fā)送 SYN=1,Seq=X的報(bào)文,表示請(qǐng)求建立連接,X是一個(gè)隨機(jī)數(shù);淘寶服務(wù)器收到這個(gè)報(bào)文后,應(yīng)答SYN=1,ACK=X+1,Seq=Y的報(bào)文,表示同意建立連接;App收到這個(gè)報(bào)文后,檢查ACK的值為自己發(fā)送的Seq值+1,確認(rèn)建立連接,并發(fā)送ACK=Y+1的報(bào)文給服務(wù)器;服務(wù)器收到這個(gè)報(bào)文后檢查ACK值為自己發(fā)送的Seq值+1,確認(rèn)建立連接。至此,App和服務(wù)器建立起TCP連接,就可以進(jìn)行數(shù)據(jù)傳輸了。

TCP也會(huì)在數(shù)據(jù)包上添加TCP頭,TCP頭除了包含一些用于校驗(yàn)數(shù)據(jù)正確性和控制數(shù)據(jù)流量的信息外,還包含通信端口信息,一臺(tái)機(jī)器可能同時(shí)有很多進(jìn)程在進(jìn)行網(wǎng)絡(luò)通信。如何使數(shù)據(jù)到達(dá)服務(wù)器后能發(fā)送給正確的進(jìn)程去處理,就需要靠通信端口進(jìn)行標(biāo)識(shí)了。HTTP默認(rèn)端口是80,當(dāng)然我們可以在啟動(dòng)HTTP應(yīng)用服務(wù)器進(jìn)程的時(shí)候,隨便定義一個(gè)數(shù)字作為HTTP應(yīng)用服務(wù)器進(jìn)程的監(jiān)聽端口,但是App在請(qǐng)求的時(shí)候,必須在URL中包含這個(gè)端口,才能在構(gòu)建的TCP包中記錄這個(gè)端口,也才能在到達(dá)服務(wù)器后,被正確的HTTP服務(wù)器進(jìn)程處理。

如果我們以POST方法提交一個(gè)搜索請(qǐng)求給淘寶服務(wù)器,那么最終在數(shù)據(jù)鏈路層構(gòu)建出來的數(shù)據(jù)幀大概是這個(gè)樣子,這里假設(shè)IP數(shù)據(jù)包的大小沒有超過鏈路層的最大傳輸單元。

c3d2ac8c-2ee4-11ee-815d-dac502259ad0.png

App要發(fā)送的數(shù)據(jù)只是key="a"這樣一個(gè)JSON字符串,每一層協(xié)議都會(huì)在上一層協(xié)議基礎(chǔ)上添加一個(gè)頭部信息,最后封裝成一個(gè)鏈路層的數(shù)據(jù)幀在網(wǎng)絡(luò)上傳輸,發(fā)送給淘寶的服務(wù)器。淘寶的服務(wù)器在收到這個(gè)數(shù)據(jù)幀后,在通信協(xié)議的每一層進(jìn)行校驗(yàn)檢查,確保數(shù)據(jù)準(zhǔn)確后,將頭部信息刪除,再交給自己的上一層協(xié)議處理。HTTP應(yīng)用服務(wù)器在最上層,負(fù)責(zé)HTTP協(xié)議的處理,最后將key="a"這個(gè)JSON字符串交給淘寶工程師開發(fā)的應(yīng)用程序處理。

LB(負(fù)載均衡)

HTTP請(qǐng)求到達(dá)淘寶數(shù)據(jù)中心的時(shí)候,事實(shí)上也并不是直接發(fā)送給搜索服務(wù)器處理。因?yàn)閷?duì)于淘寶這樣日活用戶數(shù)億的互聯(lián)網(wǎng)應(yīng)用而言,每時(shí)每刻都有大量的搜索請(qǐng)求到達(dá)數(shù)據(jù)中心,為了使這些海量的搜索請(qǐng)求都能得到及時(shí)處理,淘寶會(huì)部署一個(gè)由數(shù)千臺(tái)服務(wù)器組成的搜索服務(wù)器集群,共同為這些高并發(fā)的請(qǐng)求提供服務(wù)。

因此,搜索請(qǐng)求到達(dá)數(shù)據(jù)中心的時(shí)候,首先到達(dá)的是搜索服務(wù)器集群的負(fù)載均衡服務(wù)器,也就是說,DNS解析出來的是負(fù)載均衡服務(wù)器的IP地址。然后,由負(fù)載均衡服務(wù)器將請(qǐng)求分發(fā)到搜索服務(wù)器集群中的某臺(tái)服務(wù)器上。

負(fù)載均衡服務(wù)器的實(shí)現(xiàn)手段有很多種,淘寶這樣規(guī)模的應(yīng)用,通常使用Linux內(nèi)核支持的鏈路層負(fù)載均衡。

c3f305e0-2ee4-11ee-815d-dac502259ad0.png

這種負(fù)載均衡模式也叫直接路由模式,在負(fù)載均衡服務(wù)器的Linux操作系統(tǒng)內(nèi)核拿到數(shù)據(jù)包后,直接修改數(shù)據(jù)幀中的mac地址,將其修改為搜索服務(wù)器集群中某個(gè)服務(wù)器的mac地址,然后將數(shù)據(jù)重新發(fā)送回服務(wù)器集群所在的局域網(wǎng),這個(gè)數(shù)據(jù)幀就會(huì)被某個(gè)真實(shí)的搜索服務(wù)器接收到。

負(fù)載均衡服務(wù)器和集群內(nèi)的搜索服務(wù)器配置相同的虛擬IP地址,也就是說,在網(wǎng)絡(luò)通信的IP層面,負(fù)載均衡服務(wù)器變更mac地址的操作是透明的,不影響TCP/IP的通信連接。所以真實(shí)的搜索服務(wù)器處理完搜索請(qǐng)求,發(fā)送應(yīng)答響應(yīng)的時(shí)候,就會(huì)直接發(fā)送回請(qǐng)求的App手機(jī),不會(huì)再經(jīng)過負(fù)載均衡服務(wù)器。

總結(jié)

事實(shí)上,這個(gè)搜索字符“a”的互聯(lián)網(wǎng)之旅到這里還沒有結(jié)束。淘寶搜索服務(wù)器程序在收到這個(gè)搜索請(qǐng)求的時(shí)候,首先在本地緩存中查找是否有對(duì)應(yīng)的搜索結(jié)果。如果沒有,會(huì)將這個(gè)搜索請(qǐng)求,也就是這個(gè)字符發(fā)送給一個(gè)分布式緩存集群查找是否有對(duì)應(yīng)的搜索結(jié)果。如果還沒有,才會(huì)將這個(gè)請(qǐng)求發(fā)送給一個(gè)更大規(guī)模的搜索引擎集群去查找。

這些分布式緩存集群或者搜索引擎集群都需要通過RPC遠(yuǎn)程過程調(diào)用的方式進(jìn)行調(diào)用請(qǐng)求,也就是需要通過網(wǎng)絡(luò)進(jìn)行服務(wù)調(diào)用,這些網(wǎng)絡(luò)服務(wù)也都是基于TCP協(xié)議進(jìn)行編程的。

對(duì)于互聯(lián)網(wǎng)應(yīng)用,用戶請(qǐng)求數(shù)據(jù)離開手機(jī)通過各種網(wǎng)絡(luò)通信,最后到達(dá)數(shù)據(jù)中心的應(yīng)用服務(wù)器進(jìn)行最后的計(jì)算、處理,中間會(huì)經(jīng)過許多環(huán)節(jié),事實(shí)上,這些環(huán)節(jié)就構(gòu)成了互聯(lián)網(wǎng)系統(tǒng)的整體架構(gòu),所以通過網(wǎng)絡(luò)通信,可以將整個(gè)互聯(lián)網(wǎng)應(yīng)用系統(tǒng)串起來,對(duì)理解互聯(lián)網(wǎng)系統(tǒng)的技術(shù)架構(gòu)很有幫助,在程序開發(fā)、運(yùn)行過程中遇到各種網(wǎng)絡(luò)相關(guān)問題,也可以快速分析問題原因,快速解決問題。

鏈接:https://blog.csdn.net/qq_35030548/article/details/131872192





審核編輯:劉清

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

    關(guān)注

    0

    文章

    214

    瀏覽量

    19750
  • RPC
    RPC
    +關(guān)注

    關(guān)注

    0

    文章

    110

    瀏覽量

    11483
  • 虛擬機(jī)
    +關(guān)注

    關(guān)注

    1

    文章

    897

    瀏覽量

    27961
  • HTTP協(xié)議
    +關(guān)注

    關(guān)注

    0

    文章

    59

    瀏覽量

    9687
  • TCP通信
    +關(guān)注

    關(guān)注

    0

    文章

    146

    瀏覽量

    4192

原文標(biāo)題:一個(gè)字符的網(wǎng)路旅程

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    請(qǐng)問C語言中如何解析一個(gè)字符串?

    我是通過WIFI模塊獲取一個(gè)字符串,然后現(xiàn)在想要解析出一個(gè)字符,想把那個(gè)字符轉(zhuǎn)換成16進(jìn)制,然后賦值給P0口,
    發(fā)表于 10-13 17:59

    labview中已知4個(gè)字符串(每個(gè)字符串包含一個(gè)字符)如何隨機(jī)排列?

    labview中已知4個(gè)字符串(每個(gè)字符串包含一個(gè)字符)如何隨機(jī)排列?求大神給個(gè)程框圖。
    發(fā)表于 01-22 15:43

    51單片機(jī)發(fā)一個(gè)字符串給單片機(jī)串口,請(qǐng)問是收到一個(gè)字符串才中斷次嗎?

    在學(xué)校沒學(xué)到什么,現(xiàn)在在小工司當(dāng)學(xué)小工人,有空看下嵌入式,最近看到了串口通信。寫了個(gè)串口通信的例子。也不是自己寫的,就是看別人的例子,模仿下。但是我想不懂,串口通信是
    發(fā)表于 02-18 06:35

    請(qǐng)問使用Mbed庫(kù)的串口怎么接收一個(gè)字符串?

    getc 只能收一個(gè)字節(jié).scanf 需要字符串以換行符結(jié)尾.如題,就是非阻塞方式接收一個(gè)字符串,感謝回復(fù).STM32里有線路空閑中斷,Mbed里沒用到.
    發(fā)表于 03-01 06:17

    如何才能接收不止一個(gè)字符

    很好的天我直試圖從PC超級(jí)終端接收數(shù)據(jù),但我不明白如何才能接收不止一個(gè)字符。 以上來自于百度翻譯 以下為原文Good day I've been trying to recieve data
    發(fā)表于 07-23 12:55

    如何判斷一個(gè)字符串開頭?

    命令以“$Cmd,”開頭,以“,”分隔,以“*”結(jié)尾。單片機(jī)回復(fù)以“$Message,”開頭,以“,”分隔,以“*”結(jié)尾。如果錯(cuò)誤這以“$Message,ERROR,”開頭,以“,”分隔,以“*”結(jié)尾。我想問我如何判斷一個(gè)字符串開頭,判斷一個(gè)字符沒問題,但判斷
    發(fā)表于 09-11 22:13

    如何輸出連接的字符串中的第一個(gè)字符串?

    本帖最后由 疃12345 于 2021-4-19 22:11 編輯 如何輸出第一個(gè)字符串?要求單獨(dú)輸出第一個(gè)字符串,不影響這字符串的連接與輸出,如圖所示,輸出數(shù)值0.4869
    發(fā)表于 04-19 22:07

    求分享STM32從串口讀取一個(gè)字符的程序

    求分享STM32從串口讀取一個(gè)字符的程序
    發(fā)表于 12-09 07:16

    CC2530如何向上位機(jī)PC發(fā)送一個(gè)字符串?

    CC2530如何向上位機(jī)PC發(fā)送一個(gè)字符串?
    發(fā)表于 01-25 06:05

    C語言教程之輸出一個(gè)字符的前驅(qū)字符

    C語言教程之輸出一個(gè)字符的前驅(qū)字符,很好的C語言資料,快來學(xué)習(xí)吧。
    發(fā)表于 04-22 17:45 ?0次下載

    如何編寫C語言程序判斷一個(gè)字符是否是字母或數(shù)字

    怎樣判斷一個(gè)字符是否是一個(gè)字母? 字母表中的所有字母(包括計(jì)算機(jī)鍵盤上的所有鍵)都被賦予了個(gè)值,這些字符及其相應(yīng)的值
    發(fā)表于 01-23 14:50 ?10次下載
    如何編寫C語言程序判斷<b class='flag-5'>一個(gè)字符</b>是否是字母或數(shù)字

    解決STM32串口丟失第一個(gè)字符

    在使用STM32串口時(shí)可能會(huì)發(fā)現(xiàn)個(gè)問題就是發(fā)送字符串時(shí)第一個(gè)字符缺失情況。解決辦法在發(fā)送字符串前加入以下代碼:if(!(USART1->S
    發(fā)表于 12-27 19:28 ?10次下載
    解決STM32串口丟失第<b class='flag-5'>一個(gè)字符</b>

    如何利用Java判斷一個(gè)字符串是否包含某個(gè)字符

    如何利用Java通過不同的方法來判斷一個(gè)字符串是否包含某個(gè)字符。 **2 ****方法** 1. .contains方法
    的頭像 發(fā)表于 02-17 15:13 ?1407次閱讀
    如何利用Java判斷<b class='flag-5'>一個(gè)字符</b>串是否包含某<b class='flag-5'>個(gè)字符</b>

    如何使用JDK截?cái)?b class='flag-5'>一個(gè)字符串

    目標(biāo)。 使用JDK截?cái)?b class='flag-5'>一個(gè)字符串 Java提供了許多方便的方法來截?cái)?b class='flag-5'>一個(gè) String 。讓我們來看看。 使用 String 的 substring() 方法 String 類有
    的頭像 發(fā)表于 10-08 15:43 ?472次閱讀

    mysql字符串包含某個(gè)字符

    MySQL是種開源的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),被廣泛用于構(gòu)建Web應(yīng)用程序和其他大型數(shù)據(jù)驅(qū)動(dòng)的應(yīng)用。在進(jìn)行MySQL數(shù)據(jù)庫(kù)查詢時(shí),經(jīng)常需要使用字符串包含操作,即判斷一個(gè)字符串是否包含另一個(gè)字符
    的頭像 發(fā)表于 11-16 14:52 ?3328次閱讀