• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-380  評論-37  文章-0  trackbacks-0

            Problem:

            • 1 client 1 server, connected with non-block tcp socket. Linux 2.6.*+.
            • Client 寫入大概 3k 數據到 socket。
            • Write()正確返回實際寫入字節數。
            • Server 什么也收不到。

            Causes:

            • 發送端 MTU稍大于路由器上的MTU設置
            • 通知發送端需要拆包的ICMP在某處被殺掉了
            • 發送端不停的重發包

            設置了DF標志的ip包當遇到路由器的MTU比包小的時候,不會被路由器拆包。而路由器發送icmp消息到發送端,通知它應該拆包。

            但icmp消息被防火墻攔截下來。

            環境和現象:
            這個例子中,MTU在client和server都是1500.

            dump出來的包如下:

            客戶端看到的:
            發送了2個包,后1個包成功,第1個過大而不停的被發送:

            17:23:06.933574 IP (tos 0×0, ttl 64, id 57558, offset 0, flags [DF], proto: TCP (6), length: 1500) 10.54.40.43.43145 > 10.29.14.74.http: ., cksum 0×5096 (incorrect (-> 0×5c4e), 0:1448(1448) ack 1 win 46

            17:23:06.933580 IP (tos 0×0, ttl 64, id 57559, offset 0, flags [DF], proto: TCP (6), length: 730) 10.54.40.43.43145 > 10.29.14.74.http: P, cksum 0×4d94 (incorrect (-> 0×3933), 1448:2126(678) ack 1 win 46

            17:23:07.167049 IP (tos 0×0, ttl 64, id 57560, offset 0, flags [DF], proto: TCP (6), length: 1500) 10.54.40.43.43145 > 10.29.14.74.http: ., cksum 0×5096 (incorrect (-> 0×5b5b), 0:1448(1448) ack 1 win 46

            17:23:07.634922 IP (tos 0×0, ttl 64, id 57561, offset 0, flags [DF], proto: TCP (6), length: 1500) 10.54.40.43.43145 > 10.29.14.74.http: ., cksum 0×5096 (incorrect (-> 0×5987), 0:1448(1448) ack 1 win 46

            接受端看到的:
            只有730大小的包接受成功

            17:23:08.605622 IP (tos 0×0, ttl 59, id 57559, offset 0, flags [DF], proto: TCP (6), length: 730) 202.108.3.204.43145 > 10.29.14.74.http: P, cksum 0×9d5b (correct), 1448:2126(678) ack 1 win 46

            解決方法:
            調整發送端機器的配置:(任選1個)

            在網絡層上:
            Decrease mtu on network adapter:

            ifconfig eth* mtu 1400

            操作系統配置:
            Clear the default ‘MTU discovery’ flag with sysctl:

            net.ipv4.ip_no_pmtu_disc = 1

            或在應用程序里:
            Set socket option ‘IP_MTU_DISCOVER’ with setsockopt(2) to clear ‘DF’ flag of IP package.

            Reference:

            1. DF flag of IP package Header
            2. Internet Control Message Protocol
            3. IP fragmentation
            4. MTU or Maximum transmission unit
            5. IP programming
            6. Path MTU Discovery
            7. sysctl

            Thanks:

            esx kobe steve

            來自:http://blog.developers.api.sina.com.cn/?p=672
            原文:http://drdr-xp-tech.blogspot.com/2009/04/black-hole-socket-problem.html

            posted on 2010-01-28 18:47 小王 閱讀(5313) 評論(1)  編輯 收藏 引用 所屬分類: 網絡通訊

            評論:
            # re: Socket程序開發,發送端寫入數據成功,接收端收不到數據的現象分析 2012-11-20 14:28 | 歲月漫步
            有點看不懂啊  回復  更多評論
              
            精品久久久久中文字| 国内精品久久久久久久涩爱| 久久九九久精品国产免费直播| 久久精品国产亚洲一区二区三区| 伊人久久大香线蕉亚洲五月天| 少妇人妻综合久久中文字幕| 热久久最新网站获取| 久久人人爽人人爽人人片AV麻烦| 日韩精品久久无码中文字幕| 狠狠色丁香婷婷综合久久来| 久久婷婷国产剧情内射白浆| 久久九九有精品国产23百花影院| 亚洲国产小视频精品久久久三级| 久久人人爽人人爽人人av东京热| 色综合久久久久综合体桃花网| 亚洲精品高清国产一久久| 亚洲国产精品无码久久九九| 久久精品国产亚洲沈樵| 亚洲第一永久AV网站久久精品男人的天堂AV | 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 国内精品久久久久久久97牛牛| 精品久久久久久久| 久久综合色老色| 看全色黄大色大片免费久久久| 国产精品久久久久久| 久久精品中文闷骚内射| 一本一道久久综合狠狠老| 亚洲人AV永久一区二区三区久久| 精品久久久久久99人妻| 国产精品久久久久久搜索| 7777精品伊人久久久大香线蕉| 亚洲精品97久久中文字幕无码| 精品无码久久久久久久动漫| 日韩精品久久久肉伦网站| 中文字幕日本人妻久久久免费| 一本大道久久香蕉成人网| 精品国产91久久久久久久a| 93精91精品国产综合久久香蕉| 91久久精品电影| 女人香蕉久久**毛片精品| 伊人久久免费视频|