国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

真·卡了一個1024的 Bug,TCP 的數(shù)據(jù)包看吐了!

網(wǎng)絡(luò) 網(wǎng)絡(luò)管理
排查下服務(wù)端的日志,發(fā)現(xiàn)只有 D4 階段的業(yè)務(wù)日志打印,D5 階段的日志沒有。初步結(jié)論:設(shè)備端沒有發(fā)送 D5 階段的數(shù)據(jù)包。

一、背景

最近在預(yù)發(fā)布環(huán)境上遇到一個特別詭異的問題,事情大概是這樣的:

設(shè)備在生產(chǎn)時需要走一個注冊的過程,里面涉及到和服務(wù)端進行 TCP 通信獲取配置文件、發(fā)送密鑰等操作,但是生產(chǎn)進度會卡在70%。

流程如下圖所示。

大家不用細看里面的原理,只用看 D4 階段和 D5 階段即可。

數(shù)據(jù)通信方式:TCP。

圖片圖片

配置文件長這樣,key=value 形式存儲。

name=rabbit
B2=asdf21
...

當配置文件中的 name 字段為 rabbit 時,設(shè)備正常生產(chǎn),當配置文件中的 name 字段為 rabbit-TD 時,設(shè)備就無法生產(chǎn)成功,生產(chǎn)進度會卡在 70%。

從現(xiàn)象來看,不確定是設(shè)備端沒有執(zhí)行 D5 階段,還是服務(wù)端沒有處理成功處理 D5 階段。

二、排查過程

2.1、檢查代碼

檢查下設(shè)備端和服務(wù)端的代碼,有沒有對 name 這個字段的長度做一些限制。

結(jié)論:設(shè)備端和服務(wù)端并沒有對配置文件的字段長度做限制。

2.2、查看服務(wù)端日志

排查下服務(wù)端的日志,發(fā)現(xiàn)只有 D4 階段的業(yè)務(wù)日志打印,D5 階段的日志沒有。

初步結(jié)論:設(shè)備端沒有發(fā)送 D5 階段的數(shù)據(jù)包。

2.3、服務(wù)端抓包

思路:抓個包看下服務(wù)端有沒有收到 D5 階段的數(shù)據(jù)包。

在服務(wù)端通過 microsoft network monitor 抓包工具抓包,然后將抓包文件放到 wireshark 中排查。

下圖是設(shè)備端和服務(wù)端的 TCP 通信數(shù)據(jù)。

圖片圖片

可以看到設(shè)備向服務(wù)端發(fā)送了配置文件(D4階段),服務(wù)端發(fā)送了一個 ACK 響應(yīng)。

在TCP(傳輸控制協(xié)議)通信中,當客戶端發(fā)送一條TCP消息給服務(wù)端時,服務(wù)端通常會發(fā)送一個ACK(確認)響應(yīng)來表明它已經(jīng)成功接收到了這條消息。這是基于TCP的可靠傳輸機制,確保數(shù)據(jù)能夠正確無誤地從發(fā)送方傳輸?shù)浇邮辗健?/p>

TCP使用序列號和確認號來實現(xiàn)可靠傳輸。發(fā)送方會為每個發(fā)送的字節(jié)分配一個序列號,接收方在收到數(shù)據(jù)后會發(fā)送一個ACK確認,確認號表示接收方期望接收的下一個字節(jié)的序列號。如果發(fā)送方在一定時間內(nèi)沒有收到ACK確認,它會重新發(fā)送數(shù)據(jù)。(來自 AI)

初步結(jié)論:服務(wù)端發(fā)送了 D4 階段的 ACK 響應(yīng)。設(shè)備端沒有發(fā)送 D5 階段的數(shù)據(jù)包

注意:這個結(jié)論在后面的排查過程中被推翻。

2.4、設(shè)備端抓包

思路:抓個包看下服務(wù)端有沒有發(fā)送 D5 階段的數(shù)據(jù)包。通過如下命令在設(shè)備端抓個包:

#tcpdump -i fetho host 192.168.1.253

抓到的數(shù)據(jù)包如下所示:

圖片圖片

通過上圖的抓包結(jié)果可以看到最后一個階段是 D4 和 D5,它倆其實是將數(shù)據(jù)包合并在一起發(fā)送的(這個是我后來才發(fā)現(xiàn)的,也是 1024 卡 Bug 產(chǎn)生的源頭)

也就是說 D4 和 D5 其實是一個階段,并沒有分開發(fā)。

然后設(shè)備端一直在等待服務(wù)端返回配置文件(P6 階段)。

初步結(jié)論:設(shè)備端執(zhí)行了 D5 階段,服務(wù)端沒有執(zhí)行 P6 階段,服務(wù)端有問題。

2.5、再查服務(wù)端的數(shù)據(jù)包

這就尷尬了,設(shè)備端明明執(zhí)行了 D5 階段,但是服務(wù)端看起來沒有收到 D5 的數(shù)據(jù)包。

重新再看下最后一條數(shù)據(jù)包,報文內(nèi)容如下圖所示:

圖片圖片

打開 D4 階段的數(shù)據(jù)報文,可以看到數(shù)據(jù)里面是包含有 D4 階段的配置文件內(nèi)容以及D5階段的文件內(nèi)容,當時我看到這個報文是懵的:

我看之前的接口文檔上寫的是 D4 和 D5 階段分開發(fā)送數(shù)據(jù)?怎么又合在一起發(fā)了?

原因:設(shè)備端將 D4和D5 的數(shù)據(jù)包連續(xù)寫到 socket 中的。

初步結(jié)論:服務(wù)端沒有正確處理 D4 和 D5 合體的數(shù)據(jù)包。

那怎么辦?只能在服務(wù)端多加點日志打印看看 D5 的數(shù)據(jù)包為什么沒有正確處理呢。

2.6、分析數(shù)據(jù)包

3.6.1 name=rabbit 時的報文(可正常生產(chǎn))

每個階段發(fā)送一次報文都是按照這樣的格式進行發(fā)送:0x1234abcd, length, type, data。

  • 0x1234abcd : 起始數(shù)據(jù)
  • lenght: 業(yè)務(wù)數(shù)據(jù)長度
  • type: 請求類型
  • data:業(yè)務(wù)數(shù)據(jù)

當配置文件中的 name 字段為 rabbit 時,報文D4 和 D5 合體后的報文內(nèi)容如下:

圖片圖片

說明:

  • 指定的業(yè)務(wù)數(shù)據(jù)的長度的值必須和后面的業(yè)務(wù)數(shù)據(jù)報文的長度相等(比如D4階段的配置文件的數(shù)據(jù),D5 階段的密鑰數(shù)據(jù)的長度),否則會執(zhí)行報錯,這也是導致 D5 階段未正確執(zhí)行的根本原因。
  • D4 階段的配置文件的數(shù)據(jù)的長度為 0x00 0x00 0x03 0xF4 ,轉(zhuǎn)成十進制就是 1011。
  • 服務(wù)端在讀取 D4 階段報文時,先讀取 4 字節(jié)的配置文件數(shù)據(jù)長度length。然后讀取1 字節(jié)的請求類型type,最后再只讀取 1011 字節(jié)的數(shù)據(jù)data,如果業(yè)務(wù)數(shù)據(jù)的長度不等于 1011 就會報錯!
  • D4階段總共讀取了 1016 字節(jié)數(shù)據(jù)。然后執(zhí)行 D4 階段的邏輯。
  • 接著讀取 D5 階段的 4字節(jié)的報文起始數(shù)據(jù),然后是 4 字節(jié)的業(yè)務(wù)數(shù)據(jù)的長度(十六進制 0x00 0x00 0x01 0x00 轉(zhuǎn)成十進制是 256),這里總共讀取了 1024 字節(jié)的數(shù)據(jù),剛剛達到了服務(wù)端讀取數(shù)據(jù)的最大長度1024,就會分成下一次讀取。如下圖所示,完整讀取了業(yè)務(wù)數(shù)據(jù)的長度。

圖片圖片

  • 然后讀取 1字節(jié)的請求類型數(shù)據(jù),最后是 256 字節(jié)的密鑰數(shù)據(jù)。

3.6.2 name=rabbit-TD 時的報文(不能正常生產(chǎn))

當配置文件中的 name 字段為 rabbit-TD 時,報文 D4 和 D5 合體后的報文內(nèi)容如下:

圖片圖片

說明:

  • D4 階段的配置文件的數(shù)據(jù)的長度lenth為 0x00 0x00 0x03 0xF6 ,轉(zhuǎn)成十進制就是 1014。
  • 服務(wù)端在讀取 D4 階段報文時,先讀取 4 字節(jié)的配置文件數(shù)據(jù)長度,然后讀取1 字節(jié)的請求類型,最后再只讀取 1014 字節(jié)的數(shù)據(jù),這里總共讀取了 1019 字節(jié)數(shù)據(jù)。然后執(zhí)行 D4 階段的邏輯。這前面的步驟都沒有問題。
  • 接著讀取 D5 階段的 4字節(jié)的報文起始數(shù)據(jù),已經(jīng)讀取了 1023 字節(jié)的數(shù)據(jù)。
  • 再讀業(yè)務(wù)數(shù)據(jù)的長度 lenth,先讀取了 1字節(jié),剛好達到服務(wù)端讀取數(shù)據(jù)的最大長度 1024,分成下一次讀取。問題就出現(xiàn)在這里,業(yè)務(wù)數(shù)據(jù)的長度被分開了!

日志的內(nèi)容如下:

圖片圖片

  • 下一次讀取時,會直接讀 4 個字節(jié)的數(shù)據(jù),作為讀取業(yè)務(wù)數(shù)據(jù)的長度,這里產(chǎn)生了錯位,因業(yè)務(wù)數(shù)據(jù)的長度length已經(jīng)被讀取了一個字節(jié),就只能往后讀取 4 個字節(jié)。
  • 如下圖所示:本來 D5 階段的業(yè)務(wù)數(shù)據(jù)的長度應(yīng)該是 256 字節(jié),但是因為錯位往后讀取了一位,把請求類型type的 1 個字節(jié)讀取了,最后就是 0x00,0x01,0x00,0x02,轉(zhuǎn)成十進制就是 65538,但是 D5 階段的業(yè)務(wù)數(shù)據(jù)只有 256 字節(jié)。這就導致傳的業(yè)務(wù)數(shù)據(jù)的長度和傳的業(yè)務(wù)數(shù)據(jù)報文長度不一致,所以服務(wù)端解析的 D5 的數(shù)據(jù)報文有問題。如下圖所示:

圖片圖片

日志內(nèi)容如下:

圖片圖片

  • 結(jié)合上面的說明,來一張完整的報文數(shù)據(jù)圖:

圖片

2.7、真相大白

因讀取的數(shù)據(jù)報文達到1024 字節(jié)時,將業(yè)務(wù)數(shù)據(jù)的長度這四個字節(jié)做了切割,前面1024字節(jié)包含長度字段的第一個字節(jié),長度字段的后面3個字節(jié)和請求類型的 1個字節(jié)組成了長度字段的 4 個字節(jié),也就是錯位多讀取了后面一個字節(jié)的內(nèi)容,最后算出來長度的值為 65538,不等于后面的業(yè)務(wù)數(shù)據(jù)的 256 字節(jié),導致服務(wù)端的程序報錯,所以后續(xù)代碼就沒有執(zhí)行了。

三、解決方案

3.1、方案一

原因就是前面讀取的 length 的 1 個字節(jié)沒有和后續(xù)讀取的 length 的三個字節(jié)合成長度字段 length 的值,那么只要保證第二次讀取長度字段length的時候把之前的 1 個字節(jié)拿到即可。

3.2、方案二

還有一個卡 Bug 的方案:將 D4 階段的配置文件增加一點內(nèi)容,保證配置文件的內(nèi)容 = 1014 + 1 =1015 即可,或大于等于 1014+5 = 1019,目的就是把長度字段完整的四個字節(jié)卡到 1024 后面,或者把起始數(shù)據(jù)的四個字節(jié)也卡在 1024 后面。

驗證了兩種情況:name 為 Rabbit-TDDDDDDD 和 Rabbit-TDD 是正常生產(chǎn)的。下面是 Rabbit-TDD 的情況,正好將 D4 的數(shù)據(jù) + D5 的起始數(shù)據(jù)卡滿了 1024 字節(jié)。

如下圖所示:

  • 左邊是出 Rabbit-TD 的日志,系統(tǒng)報錯。1023-4-5=1024 或者這樣算 1014+5+5=1024。
  • 右邊是 Rabbit-TDD的日志,右邊正常執(zhí)行。1024-4+4=1024 或者這樣算 1015+5+4=1024。

圖片圖片

再來給大家算一遍如何卡 Bug 的,系統(tǒng)能正常運行。

1024 字節(jié) = 1015(配置文件報文內(nèi)容) + 4(配置文件報文長度) + 1(請求類型) + 4(D5報文起始數(shù)據(jù))。

1024 字節(jié) = 1019(配置文件報文內(nèi)容) + 4(配置文件報文長度) + 1(請求類型)= 1024 字節(jié)。

還有兩個疑問:

- D4 階段的起始數(shù)據(jù)為啥沒有算到 1024 字節(jié)中,這里我也沒弄懂 Socket的數(shù)據(jù)是怎么分開、合并發(fā)送的。

- 服務(wù)端為什么是讀取 1024 字節(jié)就會分成下次讀取?技術(shù)棧是 mina 框架,出問題的是 windows server 2003,而win10上沒重現(xiàn)這個問題。

責任編輯:武曉燕 來源: 悟空聊架構(gòu)
相關(guān)推薦

2022-05-16 08:42:26

Pandasbug

2019-04-29 07:53:11

TCP數(shù)據(jù)包TCP網(wǎng)絡(luò)編程

2022-06-08 08:14:27

Dubbo數(shù)據(jù)包源代碼

2021-12-29 19:20:41

數(shù)據(jù)GitHub服務(wù)器

2014-06-10 09:16:53

數(shù)據(jù)包

2021-05-12 00:07:27

TCPIP協(xié)議

2014-07-09 09:43:59

2011-01-18 13:50:20

路由跟蹤tcptracerou

2022-05-27 07:03:04

JDK場景線程

2020-01-10 09:20:03

手機ISOJDK

2021-09-13 08:41:52

職場互聯(lián)網(wǎng)自閉

2025-02-13 07:00:00

Dubbo-goJava服務(wù)端

2009-09-14 17:08:02

WebFormView

2020-07-07 14:49:17

中斷輪詢數(shù)據(jù)包

2021-04-22 07:47:47

JavaJDKMYSQL

2022-11-30 09:18:51

JavaMyBatisMQ

2023-03-27 00:13:26

數(shù)據(jù)包Kubernete網(wǎng)絡(luò)

2017-10-10 15:14:23

BUGiOS 11蘋果

2015-01-23 10:04:56

bug程序員

2016-09-28 14:00:56

點贊
收藏

51CTO技術(shù)棧公眾號

日本在线观看高清完整版| 在线黄色.com| 911精品美国片911久久久| 91精品国产一区二区三区蜜臀| 99热在线观看免费| 国内精品写真在线观看| 99影视tv| 久久av国产紧身裤| 最近2019中文字幕大全第二页| 欧美成人三区| 色综合久久综合网97色综合 | 欧美激情亚洲| 国产福利视频一区| 精品久久ai电影| 欧美另类在线播放| 国产综合色区在线观看| 日韩成人av在线| 日韩av福利| 中文字幕亚洲在线| 欧美videos粗暴| 欧美成人网在线| 久久婷婷国产| 亚洲一区二区三区在线免费观看| 欧美亚洲在线日韩| 国产自产女人91一区在线观看| 色中色综合网| 99国产视频| 免费成人在线视频观看| 超碰97在线看| 久久久天堂av| 99re99| 欧美日韩精品综合在线| 丝袜中文在线| 另类色图亚洲色图| 99久久99久久精品国产片果冰| 国产尤物99| 高清成人在线观看| 啊啊啊射了视频网站| 亚洲二区视频在线| www中文字幕在线观看| 久久久成人av| 一区二区中文| 亚洲一级黄色片| 91麻豆精品国产91久久久平台 | 亚洲免费视频中文字幕| 亚洲成人av在线影院| 日韩精品视频在线播放| 国产成人一二| 日韩高清在线播放| 国产精品私人影院| 黄色片网站在线| 26uuu国产精品视频| 青娱乐精品在线视频| 8×8x拔擦拔擦在线视频网站| 亚洲色图50p| 国产精品久久久久久模特| 国产精品一区二区免费在线观看| 欧洲一区二区三区在线| 8x国产一区二区三区精品推荐| 免费看成人片| 性欧美大战久久久久久久久| 成人在线视频区| 中文字幕一区二区三区四区五区| 亚洲va欧美va国产va天堂影院| 免费一级欧美在线大片| 五月婷婷综合色| 91精品在线观看入口| 欧美日韩福利| 九色视频网站入口| 久久综合久中文字幕青草| 久88久久88久久久| 青青在线视频| 亚洲免费在线精品一区| 欧美日韩精品一区二区三区| 99视频精品全国免费| 国产91福利| 国产日产欧美精品| 在线观看一区二区精品视频| 激情成人综合| 韩国中文字幕在线| 日本一区二区三区四区在线观看 | 欧美黄色片在线观看| 久久精品一区八戒影视| 精品久久福利| 在线成人私人影院| 国产成人亚洲综合| 婷婷成人激情在线网| 亚洲国产精品综合久久久| 午夜伦全在线观看| 正在播放一区二区三区| 一区二区三区视频免费| 91在线一区二区| 日韩理论电影院| 欧美jizz18性欧美| 亚洲人成无码网站久久99热国产 | 国产亚洲午夜高清国产拍精品| 国产+成+人+亚洲欧洲在线| 免费黄色av电影| 日韩av高清在线播放| 欧美成人午夜免费视在线看片| 亚洲男同性恋视频| 男女精品网站| 999久久久国产999久久久| 污污网址在线观看| 黄色污污在线观看| 国产精品com| 日韩av在线天堂网| 午夜电影一区二区三区| 国产成人免费xxxxxxxx| 日韩欧美电影| 国产日韩欧美中文在线| 色哟哟免费在线观看| 欧洲熟妇精品视频| 日韩欧美亚洲在线| 国产成一区二区| 一区二区三区无码高清视频| 午夜精品福利在线| 国产亚洲精品精华液| 久久精品久久综合| 国产精品国产一区| 伊人www22综合色| 亚洲天堂电影| 青春草视频在线观看| 日韩美女视频免费看| 亚洲午夜精品久久久久久性色| 91久久精品一区二区三| 一区二区免费在线| 亚洲精品水蜜桃| 亚洲天堂网中文字| 久久久亚洲国产美女国产盗摄| 蜜臀av国产精品久久久久| 欧美人成网站| 亚洲成av人片乱码色午夜| 小说区图片区色综合区| 中文字幕视频精品一区二区三区| 日本在线精品| 日本一区二区三区视频在线| 欧产日产国产精品视频 | 欧美一卡二卡在线| 欧美视频日韩视频| 午夜精品福利一区二区三区蜜桃| 大伊人狠狠躁夜夜躁av一区| 色综合天天天天做夜夜夜夜做| 福利一区福利二区微拍刺激| 在线亚洲免费视频| 日韩欧美一区二区三区在线| 亚洲欧美变态国产另类| 久久精品国产亚洲精品| 欧洲精品毛片网站| 爱情岛论坛亚洲入口| 免费看污污视频| 精品日韩久久久| 免费一级在线观看播放网址| 岛国成人毛片| 秋霞一区二区| 日韩欧美不卡| 欧美精品啪啪| 麻豆精品视频在线观看免费| 久久精品国产网站| 久久久久久黄色| 久久电影网站中文字幕| 激情亚洲综合在线| 91丨国产丨九色丨pron| 亚洲欧美日韩综合aⅴ视频| 丁香五六月婷婷久久激情| 欧美一区二区三区人| 日韩亚洲欧美成人| 国产精品电影一区| 青青成人在线| 北条麻妃视频在线| 污网站在线看| 成人免费福利| 亚洲九九在线| 国产成人av电影在线观看| 精品一区二区国语对白| 亚洲同性gay激情无套| 日韩精品一区二区三区视频| 欧美另类在线播放| 成人黄色在线免费观看| 美臀av在线| 国产精品无码av在线播放| 天天综合入口| 最近高清中文在线字幕在线观看1| 91九色鹿精品国产综合久久香蕉| 日韩欧美电影| 国产欧美一区二区精品婷婷| 日本乱人伦aⅴ精品| 精品国内产的精品视频在线观看| 92看片淫黄大片欧美看国产片| 国产aaa免费视频| 成人性爱视频在线观看| www.久久久.com| 视频一区视频二区在线观看| 国产精品网站导航| 亚洲午夜未删减在线观看| 精品国产一区二区三区麻豆免费观看完整版 | 2017欧美狠狠色| 欧美三级日韩在线| 3d动漫啪啪精品一区二区免费 | 欧美日韩精品一区二区视频|