国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

TCP大端小端問題

小陽光

workerman 需要處理大端小端問題嗎?網(wǎng)絡(luò)字節(jié)序是大端,如果服務(wù)器是小端,應(yīng)該需要轉(zhuǎn)換,這個轉(zhuǎn)換是誰完成的呢?如果是workerman完成的我想看看workerman轉(zhuǎn)換的代碼,我沒有看到源碼有這個操作。還是說需要開發(fā)人員自己收到數(shù)據(jù)后轉(zhuǎn)換?

4130 2 0
2個回答

walkor 打賞

workerman不關(guān)心傳輸?shù)臄?shù)據(jù)是什么,業(yè)務(wù)傳輸?shù)氖谴蠖?,就是大端,傳輸?shù)氖切《司褪切《恕?/p>

  • 小陽光 2020-07-11

    前提 :網(wǎng)絡(luò)序是大端,和機器操作系統(tǒng)無關(guān),

    假設(shè) 1 服務(wù)器機器是小端序。

    假設(shè) 2 我們要開發(fā)一個workerman的http服務(wù)

    例:客戶端發(fā)送 int 0x12345678,(大端 0x12, 0x34, 0x56, 0x78 小端 0x78, 0x56, 0x34, 0x12 ),因為網(wǎng)絡(luò)序是大端固定的,也就是說不管什么客戶端發(fā)送0x12345678都是0x12, 0x34, 0x56, 0x78 給workerman的tcp服務(wù)端

    在workerman服務(wù)器收到后如果沒有處理就給了上層協(xié)議http,這是服務(wù)器是小端序,它解析0x12, 0x34, 0x56, 0x78 不就不是原來的 0x12345678了嗎?

    如果workerman沒有處理大小端,那么上層的http服務(wù)器必須要先轉(zhuǎn)換大小端吧?不然客戶端發(fā)送的int 0x12345678 服務(wù)器解析不出是int 0x12345678呀。

    綜上我的意思是如果workerman的tcp 不管大小端 那么基于workerman tcp協(xié)議的http服務(wù)就必須轉(zhuǎn)換才對。他們總有一個要處理才對。(我在現(xiàn)有的http服務(wù)里面沒有找到轉(zhuǎn)換代碼,按照道理是底層轉(zhuǎn)換才對,不可能http來轉(zhuǎn),我在想 是不是$buffer = fread($socket, self::READ_BUFFER_SIZE); 這里就轉(zhuǎn)換好了,也就說 fread函數(shù)幫我們做了這件事?)

    有理解錯誤的地方請大神糾正。

  • phpcreeper 2020-07-12

    @6917:
    你舉的這個例子我也有同樣的疑惑,fread應(yīng)該是沒干這個事情,其中的幾個應(yīng)用層協(xié)議比如frame、ws、websocket源碼中有pack/unpack的身影,這個是用來是進(jìn)行網(wǎng)絡(luò)大端序處理的,但是這個http協(xié)議里卻看不到,不明白是怎么處理這個大端小端序的; 我整體也理解不了,期待老大指點迷津。

walkor 打賞

首先,
workerman底層永遠(yuǎn)不會轉(zhuǎn)換字節(jié)序,傳輸?shù)氖鞘裁淳褪鞘裁础?/p>

然后協(xié)議層,有些協(xié)議不涉及字節(jié)序,有些協(xié)議本身在包頭可能有涉及字節(jié)序。包頭涉及字節(jié)序的就按照協(xié)議規(guī)定字節(jié)序解析即可。

HTTP協(xié)議作為舉例:
HTTP頭
http協(xié)議是文本協(xié)議,協(xié)議本身不涉及大小端解析,抓包你能看到,http頭是類似 GET / HTTP1.1\r\nHost: ...的明文字符。包頭如果涉及數(shù)字的傳輸,都是用明文字符傳輸。所以http協(xié)議層沒有大小端轉(zhuǎn)換的說法。

HTTP包體
如果http協(xié)議傳輸?shù)臄?shù)據(jù)中包含了需要考慮字節(jié)序的數(shù)據(jù),需要客戶端與服務(wù)端事先溝通好使用大端還是小端(一般都是用網(wǎng)絡(luò)字節(jié)序也就是大端,這樣每個機器都能容易識別),然后雙方按照約定在業(yè)務(wù)邏輯里以約定好的字節(jié)序讀取這部分?jǐn)?shù)據(jù)。workerman底層以及http協(xié)議層面不會給你自動轉(zhuǎn)換(它也無法給你轉(zhuǎn)換,在程序看來數(shù)據(jù)都是字節(jié),不知道數(shù)據(jù)具體含義,更不知道從哪一位開始表示一個大端或者小端的數(shù)據(jù))。

其它協(xié)議也一樣,
frame協(xié)議規(guī)定前4個字節(jié)是網(wǎng)絡(luò)字節(jié)序的包長數(shù)據(jù),workerman收到frame協(xié)議的數(shù)據(jù)后,在協(xié)議層會以網(wǎng)絡(luò)字節(jié)序解析并得到這個包長。去掉前4個字節(jié)剩下的是包體數(shù)據(jù)。與http協(xié)議一樣,包體是否有包含字節(jié)序的數(shù)據(jù)以及具體是大端還是小端,位置在第幾個字節(jié),frame協(xié)議不關(guān)心也不會自動解析轉(zhuǎn)換,因為他們都是業(yè)務(wù)邏輯該處理的事情。

  • phpcreeper 2020-07-13

    @1 也就是說除了某些協(xié)議自身可能涉及到字節(jié)序外,其他涉及到字節(jié)序的數(shù)據(jù)都是需要交由客戶端和服務(wù)端在業(yè)務(wù)層互相協(xié)調(diào)按照約定來處理,這樣理解對嗎?

  • walkor 2020-07-13

年代過于久遠(yuǎn),無法發(fā)表回答
??