用戶數(shù)據(jù)報(bào)協(xié)議(User Datagram Protocol,縮寫為UDP),又稱用戶數(shù)據(jù)報(bào)文協(xié)議,是一個(gè)簡(jiǎn)單的面向數(shù)據(jù)報(bào)(package-oriented)的傳輸層協(xié)議,正式規(guī)范為RFC 768。
成都創(chuàng)新互聯(lián)公司主要從事成都做網(wǎng)站、網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)東豐,10多年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):13518219792
UDP只提供數(shù)據(jù)的不可靠傳遞,它一旦把應(yīng)用程序發(fā)給網(wǎng)絡(luò)層的數(shù)據(jù)發(fā)送出去,就不保留數(shù)據(jù)備份(所以UDP有時(shí)候也被認(rèn)為是不可靠的數(shù)據(jù)報(bào)協(xié)議)。
UDP在IP數(shù)據(jù)報(bào)的頭部?jī)H僅加入了復(fù)用和數(shù)據(jù)校驗(yàn)。
由于缺乏可靠性且屬于非連接導(dǎo)向協(xié)議,UDP應(yīng)用一般必須允許一定量的丟包、出錯(cuò)和復(fù)制粘貼。
1 在接收udp包時(shí),如果接收包時(shí)給定的buffer太小的話,就要自己解決粘包問(wèn)題。
2 udp包的發(fā)送和接收不保證一定成功,不保證按正確順序抵達(dá)。
3 如果不允許丟包的情況出現(xiàn)的話,要有重發(fā)機(jī)制來(lái)保證,如:反饋機(jī)制確認(rèn)。
服務(wù)端
客戶端
PUSH指令主要用于編寫子程序和中斷服務(wù)程序,可以臨時(shí)保存程序狀態(tài)字PSW和累加器ACC的內(nèi)容 或其它寄存器和存儲(chǔ)器單元的內(nèi)容。
在子程序和中斷服務(wù)程序結(jié)束返回主程序前,要用POP彈棧指令,從堆棧中取出被保護(hù)的數(shù)據(jù),恢復(fù)程序狀態(tài)字PSW和累加器ACC的內(nèi)容 或其它寄存器和存儲(chǔ)器單元的內(nèi)容。
呵呵 滿意 就選滿意回答啊
學(xué)完了 net/http 和 fasthttp 兩個(gè)HTTP協(xié)議接口的客戶端實(shí)現(xiàn),接下來(lái)就要開(kāi)始Server的開(kāi)發(fā),不學(xué)不知道一學(xué)嚇一跳,居然這兩個(gè)庫(kù)還支持Server的開(kāi)發(fā),太方便了。
相比于Java的HTTPServer開(kāi)發(fā)基本上都是使用Spring或者Springboot框架,總是要配置各種配置類,各種 handle 對(duì)象。Golang的Server開(kāi)發(fā)顯得非常簡(jiǎn)單,就是因?yàn)樘貏e簡(jiǎn)單,或者說(shuō)沒(méi)有形成特別統(tǒng)一的規(guī)范或者框架,我發(fā)現(xiàn)了很多實(shí)現(xiàn)方式,HTTP協(xié)議基于還是 net/http 和 fasthttp ,但是 handle 語(yǔ)法就多種多樣了。
先復(fù)習(xí)一下: Golang語(yǔ)言HTTP客戶端實(shí)踐 、 Golang fasthttp實(shí)踐 。
在Golang語(yǔ)言方面,實(shí)現(xiàn)某個(gè)功能的庫(kù)可能會(huì)比較多,有機(jī)會(huì)還是要多跟同行交流,指不定就發(fā)現(xiàn)了更好用的庫(kù)。下面我分享我學(xué)到的六種Server開(kāi)發(fā)的實(shí)現(xiàn)Demo。
基于 net/http 實(shí)現(xiàn),這是一種比較基礎(chǔ)的,對(duì)于接口和 handle 映射關(guān)系處理并不優(yōu)雅,不推薦使用。
第二種也是基于 net/http ,這種編寫語(yǔ)法可以很好地解決第一種的問(wèn)題,handle和path有了類似配置的語(yǔ)法,可讀性提高了很多。
第三個(gè)基于 net/http 和 github.com/labstack/echo ,后者主要提供了 Echo 對(duì)象用來(lái)處理各類配置包括接口和handle映射,功能很豐富,可讀性最佳。
第四種依然基于 net/http 實(shí)現(xiàn),引入了 github.com/gin-gonic/gin 的路由,看起來(lái)接口和 handle 映射關(guān)系比較明晰了。
第五種基于 fasthttp 開(kāi)發(fā),使用都是 fasthttp 提供的API,可讀性尚可,handle配置倒是更像Java了。
第六種依然基于 fasthttp ,用到了 github.com/buaazp/fasthttprouter ,有點(diǎn)奇怪兩個(gè)居然不在一個(gè)GitHub倉(cāng)庫(kù)里。使用語(yǔ)法跟第三種方式有點(diǎn)類似,比較有條理,有利于閱讀。
HTTP協(xié)議全稱超文本傳輸協(xié)議(HyperText Transfer Protocol)是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議,它詳細(xì)規(guī)定了瀏覽器和WWW服務(wù)器之間通信的規(guī)則,通過(guò)Internet傳送WWW文檔的數(shù)據(jù)傳送協(xié)議。
Web服務(wù)是HTTP協(xié)議的一個(gè)服務(wù),HTTP協(xié)議承載在TCP協(xié)議之上。Web服務(wù)工作流程
基于HTTP構(gòu)建的服務(wù)標(biāo)準(zhǔn)模型包括客戶端和服務(wù)端,HTTP請(qǐng)求從客戶端發(fā)出,服務(wù)端接收到請(qǐng)求后進(jìn)行處理,然后將響應(yīng)返回給客戶端。
HTTP服務(wù)端核心工作是如何接收來(lái)自客戶端的請(qǐng)求,并向客戶端返回響應(yīng)。當(dāng)HTTP服務(wù)器接收到客戶端請(qǐng)求時(shí),首先會(huì)進(jìn)入路由模塊,路由又稱為服務(wù)復(fù)用器(Multiplexer),路由的工作在于請(qǐng)求找到對(duì)應(yīng)的處理器(Handler),處理器對(duì)接收到的請(qǐng)求進(jìn)行對(duì)應(yīng)處理后,構(gòu)建響應(yīng)并返回給客戶端。
Go語(yǔ)言通過(guò)引入 net/http 包來(lái)實(shí)現(xiàn)HTTP網(wǎng)絡(luò)訪問(wèn),并提供HTTP客戶端和服務(wù)端的實(shí)現(xiàn)。
創(chuàng)建HTTP服務(wù)需經(jīng)過(guò)2個(gè)階段
例如:創(chuàng)建HTTP服務(wù)
理解HTTP服務(wù)關(guān)鍵點(diǎn)在于路由器和處理器
服務(wù)復(fù)用器
處理器
http.ServeMux 內(nèi)部使用一個(gè) map 映射來(lái)保存所有處理器, http.muxEntry 是一個(gè)多路復(fù)用器入口實(shí)體。
可以發(fā)現(xiàn)在 http.muxEntry 字段中存在著 http.Handler 接口類型的 h
雖然 http.ServeMux 也實(shí)現(xiàn)了 http.ServerHTTP() 算得上是一個(gè) http.Handler ,但 http.ServeMux 的 http.ServeHTTP() 并非用來(lái)處理請(qǐng)求和響應(yīng),而是用來(lái)查找注冊(cè)路由對(duì)應(yīng)的處理器。
當(dāng) http.ServeMux 路由器設(shè)置路由規(guī)則后,會(huì)通過(guò)它實(shí)現(xiàn)的 ServeHTTP() 完成請(qǐng)求的分發(fā)。當(dāng)路由器接收到請(qǐng)求后若請(qǐng)求的URI為 * 則會(huì)關(guān)閉連接,否則會(huì)調(diào)用自身的 Handler() 來(lái)獲取對(duì)應(yīng)路由的處理器,最終通過(guò)調(diào)用 h.ServeHTTP(w,r) 實(shí)現(xiàn)對(duì)應(yīng)路由的實(shí)現(xiàn)邏輯。
路由器會(huì)根據(jù)用戶請(qǐng)求的URL路徑去匹配自身存儲(chǔ)的在 map 中的 handler ,最終調(diào)用匹配到的 handler 的 ServeHTTP() 以實(shí)現(xiàn)執(zhí)行對(duì)應(yīng)路由的處理函數(shù)。
創(chuàng)建 http.ServeMux 實(shí)例的方式有兩種
http.DefaultServeMux 是默認(rèn)的 http.ServeMux ,會(huì)隨著 net/http 包初始化而被自動(dòng)初始化。
當(dāng) http.ListenAndServe() 在沒(méi)有提供其他處理器的情況下,即它的入?yún)?handler 為 nil 時(shí)內(nèi)部會(huì)使用 http.DefaultServeMux 。
net/http 包提供了一組快捷的注冊(cè)路由的函數(shù) http.Handle() 、 http.HandleFunc() 來(lái)配置 http.DefaultServeMux ,快捷函數(shù)會(huì)將處理器注冊(cè)到 http.DefaultServeMux 。
二者之間的區(qū)別在于 handler 參數(shù)上
http.Handle() 的 handler 是一個(gè) http.Handler 接口實(shí)例,也就是說(shuō)傳入的 handler 必須要自己提前實(shí)現(xiàn) http.Handler 接口的 ServerHTTP(ResponseWriter, *Request) 方法。
例如:將處理器放入閉包中,將參數(shù)傳入處理器。
http.HandleFunc() 的 handler 直接是一個(gè)原型為 func(ResponseWriter, *Request) 的函數(shù),深入追蹤會(huì) HandleFunc() 會(huì)發(fā)現(xiàn)一個(gè)自定義的函數(shù)類型。
因此任何具有 func(ResponseWriter, *Request) 簽名的函數(shù)都能轉(zhuǎn)換成為一個(gè) http.HandlerFunc 類型的對(duì)象。同時(shí)自定義的函數(shù)類型中已經(jīng)實(shí)現(xiàn)了 ServeHTTP() 方法,因此它也是一個(gè) http.Handler 。
例如:返回時(shí)使用一個(gè)到 http.HandlerFunc 類型的隱式轉(zhuǎn)換
net/http 包提供了 http.NewServeMux() 來(lái)創(chuàng)建一個(gè)自定義的 http.ServeMux 實(shí)例
例如:調(diào)用 http.NewServeMux() 會(huì)創(chuàng)建服務(wù)復(fù)用器
例如:創(chuàng)建靜態(tài)服務(wù)
Go中沒(méi)有繼承、多態(tài),可通過(guò)接口來(lái)實(shí)現(xiàn)。而接口則是定義聲明的函數(shù)簽名,任何結(jié)構(gòu)體只要實(shí)現(xiàn)與接口函數(shù)簽名相同的方法,即等同于實(shí)現(xiàn)了對(duì)應(yīng)的接口。
例如: http.HandleFunc() 處理函數(shù)實(shí)現(xiàn)實(shí)際上調(diào)用默認(rèn) http.DefaultServeMux 的 HandleFunc() 方法
例如:調(diào)用 http.Handle() 方法則第二個(gè)參數(shù) handle 必須實(shí)現(xiàn) http.Handler 接口的 ServeHTTP() 方法,也就是說(shuō)只要具有 ServeHTTP() 簽名方法即可作為處理器。
例如:自定義處理器
http.HandlerFunc 自身已實(shí)現(xiàn) http.Handler 接口的 ServeHTTP() 方法,因此它也是一個(gè)處理器。
http.HandlerFunc 的作用是將自定義函數(shù)轉(zhuǎn)換為 http.Handler 處理器類型,當(dāng)調(diào)用 http.HandlerFunc(fn) 后會(huì)強(qiáng)制將 fn 函數(shù)類型轉(zhuǎn)換為 http.HandlerFunc 類型,這樣 fn 函數(shù)就具有了 ServeHTTP() 方法,同時(shí)也就轉(zhuǎn)換成為了一個(gè) http.Handler 處理器。因此 http.HandlerFunc 又稱為適配器。
當(dāng)分別處于大小端模式下的內(nèi)容存放如下
(1)大端模式存儲(chǔ)(存儲(chǔ)地址為16位)
地址 數(shù)據(jù)
0x0004(高地址) 0x44
0x0003 0x33
0x0002 0x22
0x0001(低地址) 0x11
(2)小端模式存儲(chǔ)(存儲(chǔ)地址為16位)
地址 數(shù)據(jù)
0x0004(高地址) 0x11
0x0003 0x22
0x0002 0x33
0x0001(低地址) 0x44
在前面也簡(jiǎn)單闡述了大小端序的定義并結(jié)合簡(jiǎn)單實(shí)例來(lái)說(shuō)明,接下來(lái)會(huì)給出詳細(xì)實(shí)例來(lái)說(shuō)明:
1、大端序(Big-Endian):或稱大尾序
一個(gè)類型: int32 的數(shù) 0X0A0B0C0D的內(nèi)存存放情況
數(shù)據(jù)是以8bits為單位
2、小端序(little-endian):或稱小尾序
比如0x00000001
大端序:內(nèi)存低比特位 00000000 00000000 00000000 00000001 內(nèi)存高比特位
小端序:內(nèi)存低比特位 10000000 00000000 00000000 00000000 內(nèi)存高比特位
其實(shí)在前面羅列出那么東西,最終是為了接下來(lái)講述的在golang中涉及到網(wǎng)絡(luò)傳輸、文件存儲(chǔ)時(shí)的選擇。一般來(lái)說(shuō)網(wǎng)絡(luò)傳輸?shù)淖止?jié)序,可能是大端序或者小端序,取決于軟件開(kāi)始時(shí)通訊雙方的協(xié)議規(guī)定。TCP/IP協(xié)議RFC1700規(guī)定使用“大端”字節(jié)序?yàn)榫W(wǎng)絡(luò)字節(jié)序,開(kāi)發(fā)的時(shí)候需要遵守這一規(guī)則。默認(rèn)golang是使用大端序。詳情見(jiàn)golang中包encoding/binary已提供了大、小端序的使用
輸出結(jié)果:
16909060 use big endian:
int32 to bytes: [1 2 3 4] ### [0001 0002 0003 0004]
bytes to int32: 16909060
16909060 use little endian:
int32 to bytes: [4 3 2 1] ### [0004 0003 0002 0001]
bytes to int32: 16909060
在RPCX框架中關(guān)于RPC調(diào)用過(guò)程涉及的傳遞消息進(jìn)行編碼的,采用的就是大端序模式
由于工作的契機(jī),最近學(xué)習(xí)了下Gossip,以及go語(yǔ)言的實(shí)現(xiàn)版本HashiCorp/memberlist。網(wǎng)上有個(gè)最基本的memberlist使用的example,在下邊的鏈接中,感興趣可以按照文檔運(yùn)行下感受感受。本文主要講解memberlist v0.1.5 的使用細(xì)節(jié)。
Gossip是最終一致性協(xié)議,是目前性能最好,容錯(cuò)性最好的分布式協(xié)議。目前Prometheus的告警組件alertmanager、redis、s3、區(qū)塊鏈等項(xiàng)目都有使用Gossip。本文不介紹Gossip原理,大家自行谷歌。
簡(jiǎn)單的幾步即可搭建gossip集群
感謝已經(jīng)有網(wǎng)友為我們實(shí)現(xiàn)了一個(gè)example(
)。
哪里有問(wèn)題,還請(qǐng)大家多多指正
新聞名稱:go語(yǔ)言網(wǎng)絡(luò)協(xié)議 go語(yǔ)言tcp框架
轉(zhuǎn)載來(lái)于:http://sd-ha.com/article32/hiespc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、建站公司、定制網(wǎng)站、網(wǎng)站導(dǎo)航、App開(kāi)發(fā)、標(biāo)簽優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)