<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    很久很久以前

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      34 隨筆 :: 4 文章 :: 17 評論 :: 0 Trackbacks

    2007年5月19日 #

    Winsock 10053錯誤分析

     WSAGetLastError可能會返回10053錯誤,查msdn的解釋是:

    WSAECONNABORTED 10053

    Software caused connection abort.

    An established connection was aborted by the software in your host computer, possibly due to a data transmission time-out or protocol error.

    神馬?軟件原因造成的連接中斷,這是什么意思,不跟沒說一樣的么?
    google一下唄

    Berkeley description:

    A connection abort was caused internal to your host machine. The software caused

    a connection abort because there is no space on the socket’s queue and the socket

     cannot receive further connections.

           

    WinSock description:

    Partly the same as Berkeley. The error can occur when the local network system aborts

    a connection. This would occur if WinSock aborts an established connection after data

    retransmission fails  (receiver never acknowledges data sent on a datastream socket).

           

    TCP/IP scenario:

    A connection will timeout if the local system doesn’t receive an (ACK)nowledgement for

    data sent.  It would also timeout if a (FIN)ish TCP packet is not ACK’d

    (and even if the FIN is ACK’d, it will eventually timeout if a FIN is not returned).

     

    伯克利說這種連接中斷是因為宿主機器的內部原因,因為軟件導致的連接中斷,可能是因為socket的隊列滿并且這個socket不能接收更多的連接了。
    這還不如不說,越說越糊涂了。
    winsocket的描述,似乎還靠譜一些,這種錯誤一般發生在一個建立的連接被重發失敗的情況下產生,接收方沒有響應數據發回來。但還是比較模糊。
    再看看tcp ip標準文檔的說法,如果本地系統沒有收到發送數據的響應(ack)那么這連接就會超時。如果tcp的fin包沒有被ack(或者fin包被ack了但fin沒有返回)那么也會超時。但是,但是,超時跟這個10053有神馬關系?
    再看后續的解釋:
    從參考1中找到如下的描述:

    The Scenario: 
    An HTTP POST is to be sent to an HTTP server.
    The server begins reading the POST and notices that the HTTP request header is invalid.
    It immediately sends an HTTP response (with an error status, perhaps status=400) and closes the connection without trying to continue reading the remainder of the HTTP request that is forthcoming.

    Meanwhile, the client is still happily writing the remainder of the HTTP request to the socket. (Remember a TCP/IP socket connection needs to be closed from both sides. In this case, the server has closed its side, but the client is still pumping data into the half-open connection.)
    The client finishes writing the HTTP POST to the socket — meaning that data has been buffered to Winsock. The client application then tries to read the HTTP response, but it cannot because the outgoing retransmission (of the buffered data by WinSock) failed and the socket connection was shutdown on the client side (by Winsock). Even though the HTTP server sent the response, it is lost and cannot be retrieved. The error your application will receive when
    trying to read the HTTP response on the socket is WSAECONNABORTED. The word "software" in any of the above error messages refers to "WinSock".

    Go back and re-read the original error explanations. Hopefully, after that explanation, you’ll say "Aha! I understand what they’re talking about!".

     

    啊哈,又有http了,大概意思就是http server收到請求了,但發現有問題,那么回一個http錯誤碼,然后就關閉了socket,但與此同時,client端還在很開心地向socket寫數據,注意哦,tcp是全雙工的。client寫完畢后,實際上數據只是放到了發送方的緩沖區中,不一定已經發出去了,如果寫得不好的程序,這個時候就開始從socket讀數據了,這時候就會產生一個WSACONNECTABORTED錯誤,windows上對應的就是10053錯誤。

    但這個解釋實際上是不能讓人滿意的,只是舉出了一種場景,但為什么會產生還沒有解釋。后面又搜到了個參考2,首先解釋10053錯誤是收到fin后client會放棄發送緩沖區中的數據,同時上報錯誤。雖然說法還有點一頭霧水。

    不過這兩個參考給我們一個思路,重現這個問題。

    于是簡單寫個測試用的c-s程序,大概流程如下

     

     

    圖1 CS程序簡化流程圖

    這個簡單程序演示如何出現10053錯誤(以及10054錯誤)。

    如果server在收到client發送的數據后立即關閉socket,那么client再讀時,會收到10053錯誤;如果server收到發送數據后,立即crash,那么隨后client再讀取時會收到10054錯誤。

    ok,能夠重現場景了,那么我們來分析一下更細節的方面,網絡問題自然是抓包,本問題處理抓包還要看一下tcp的狀態以便輔助分析,我們在client端每次操作之前都打印當前的tcp狀態。

    下面是client端發送記錄和對應的netstat情況

    圖2 10053錯誤client端tcp狀態流轉

    client在發送之前tcp狀態是established,在發送之后,server會立即關閉,tcp狀態也變為close_wait,但這只是單方向的關閉,client可以繼續發數據,但client發送后,server立即退出了,導致后續recv會失敗并且返回10053。對應抓包情況如下:



    圖3 10053錯誤client端tcp抓包

    整個通信過程如下:
    1-3.三次握手建立連接
    4.客戶端(10.10.86.93)向服務器端(10.10.86.98)發送數據,1字節
    5.server 中止 發送fin(同時ack之前那個push)
    6.client ack 那個fin
    7.client再發送兩個字節
    8.server此時已經關閉socket,屬于非正常情況,回復復位命令

    整個過程可以重現10053情況,tcp發送分組數據的情況也一目了然,事情到此就可以了么?顯然不是,你也看到了后面還有很多文字,不知此時你心中的問題是否跟我一樣,先說我自己的吧,通過抓包發現這里的異常關閉有個reset,但reset一般是10054(Connection reset by peer)的錯誤,那么10053與10054的區別在哪里。要搞清楚問題也不難,重現場景抓包分析。
    以下是修改上面的cs程序,在client發送的1字節包后,立即crash,這導致的問題是操作系統會立即回收所有資源,包括socket資源。




    圖4 10054錯誤client端tcp狀態流轉

    可以看到在crash之前這個tcp都是established狀態。crash之后,client端接收數據時會收到10054錯誤,場景重現了,我們再看一下抓包情況



    圖5 10054錯誤client端tcp抓包

    這個抓包情況跟10053很像,1-7也同10053,在8時,client收到server發過來的reset,表示當前連接被強制復位了。
    對比10053和10054可以發現,如果srv返回fin標志后再reset那么對應的錯誤就是10053,如果直接reset就是10054錯誤。回過頭來在看參考2中的說法也就有點感覺了。

    總結一下:
    1.遇到不了解的問題,google是非常好的方法
    2.對于一般問題,重現之很重要,可以反復發現問題并驗證問題。自己寫程序或者搭環境盡量重現。
    3.網絡問題抓包是利器,包括各種工具的使用netstat wireshark ping traceroute等。
    4.多重問題對比其中的差異,這里對比10053錯誤和10054錯誤。
    5.理論基礎要搭好,本次問題主要是tcp的異常斷開問題,熟悉tcp斷開的半關閉和復位邏輯,不過理論還是理論,同樣是復位在不同場景下的錯誤碼不同。并且實現上也跟具體的操作系統相關。
    6.實際工作中,
    10053錯誤時,用戶主要是處于透明代理情況,那么這一般是又有用戶所在的代理服務器異常關閉導致的,可能跟我們的離線文件私有協議被用戶所在的代理服務器拒絕掉導致的。

    7.回過頭來在看一開始的解釋,所謂軟件原因造成的連接終端,就是本例子中,server端在shoutdown本方向傳輸時,立即關閉了socket,導致本應該等待對方發送fin來完全結束的正常邏輯被打破,編程單方向強制中止本次tcp,導致client端之后向上報錯,就是所謂的10053錯誤了,這里的軟件就是server端的那個程序。(不過也有種說法是,客戶端發送錯誤數據,導致server端保護機制而強制關閉)


    參考:

    1. http://www.chilkatsoft.com/p/p_299.asp   
    2. http://bbs.csdn.net/topics/360024280#post-361829232
    3. 《TCP/IP詳解(卷一)》18章 TCP連接的建立和中止

     

     

    posted @ 2013-11-28 11:22 Long Long Ago 閱讀(29198) | 評論 (1)編輯 收藏

    最近改造文件傳輸,參考libcurl,考慮到他支持那么多協議,但我只關心http的,所以考慮是否可以只生成http支持的版本,查了一下,果然可以。
    下載,如果不需要最新的,那么只要下載個zip包就好了。
    通過download wizard可以指引你下載不同的版本:http://curl.haxx.se/dlwiz/
    選擇
    source code - 平臺無關- 找到最新版本下載,解壓縮
    編譯比較簡單有build指令
    不過我從vs目錄下找到一個2005版本的vcproj文件,用這個也可以編譯,不過要設置一下include目錄為../../../include
     上面是廢話了,關鍵的怎么值生成對http的支持呢
    只要在編譯指令中增加定義HTTP_ONLY宏就可以了,就這么簡單。
    詳細說明在這里http://curl.haxx.se/docs/install.html
    posted @ 2013-11-21 20:40 Long Long Ago 閱讀(700) | 評論 (0)編輯 收藏

    路由器軟件部分的幾個概念:CFE、固件(Firmware)、NVRAM
    CFE的作用跟PC的BIOS一樣是負責引導操作系統的;固件就是路由器的操作系統,就像PC上的Windows一樣;NVRAM則用于存儲路由器的設置,相當于PC的CMOS。
    當路由器插上電后自動進入CFE,CFE進行類似PC的BIOS那樣進行自檢,自檢通過后就引導路由器的固件了(相當于的PC的Windows了),正常情況下最多一分鐘路由器的固件就會引導完畢,并且Power燈是常亮的。如果Power燈一閃一閃,那一般是CFE沒有引導成功路由器的固件(固件不存在、不正確、已損壞等等)。
    那么我們平常刷固件會把CFE也刷了嗎?呵呵,不會的,就像你平時裝Windows一樣,不管你是裝XP也好,Vista也好,Win7也好,都不會對你的BIOS進行更新。那我想刷CFE該用什么方法?一般用戶用路由器原廠的CFE即可,如果要玩的深入一些想刷CFE,那么可以通過JTAG或者telnet方式來刷(比較危險,而且受固件限制,有些固件不支持)。
    主要是對硬件環境進行初始化,image的更新,加載kernel等
    posted @ 2013-11-13 20:34 Long Long Ago 閱讀(254) | 評論 (0)編輯 收藏

    好久沒有更新這個blog了,java也放下了許久。現在開始重新更新本blog
    posted @ 2010-10-30 13:44 Long Long Ago 閱讀(238) | 評論 (0)編輯 收藏

    本文主要介紹了JXTA中的各種概念。
    1.Peer。一個peer就是實現了一個或多個JXTA協議的網絡設備。比如傳感器,電話, PDA,PC,服務器,巨型機等等。每一個peer與其他peer都是獨立操作并且是異步的。有peer ID來唯一標識一個peer。peer使用JXTA協議公開一個或多個網絡接口(network interface),每一個公開的接口都被廣告為一個peer端點(peer endpoint),這個peer端點唯一標識了一個網絡接口。peer之間不需要有直接的點對點的網絡連接。可以使用中間的peer作為peer的消息路由,將由于硬件網絡或者網絡配置(NATs,防火墻或者代理)而造成的兩個通信peer進行互聯。peer通常被設計成網絡中自然地互相發現,從而構成暫時的或持久的關系成為peer組(peer gorup)。
    2.Peer Group.一個peer組是一個peer的集合,這些peer都有一組相同的服務。peer自組織的加入到peer組中,并通過一個唯一的peer組id來區別這些peer組。每一個peer組都可以建立一個屬于自己的memebership policy,從任何人可以加入到最嚴格的安全驗證以及受保護方式(需要完全的認證書來加入)。一個peer可以同時屬于多于一個peer組。默認地,第一個peer組被實例的組是Net Peer Group。所有的peer都屬于Net Peer Group。peer可以選擇加入其他的peer group。JXTA協議描述了peer如何公開,發現,加入以及監控peer組。
         如下幾點說明了創建peer組的目的。
    1. 建立安全的環境。peer組可以創建一個本地控制域,在這個域中使用一個特定的安全策略。這個安全策略可以簡單的只是一個明文的帳號 /口令交換,也可以像PKI一樣成熟。peer組界定認證的成員訪問和公開受保護的內容(content)。peer組在建立了一個邏輯上的區域,從而對訪問peer組的資源進行界定。
    2. 創建一個范圍環境。peer組裕興建立一個本地的專用域。比如,peer可以組織起來實現一個文檔共享網絡或者一個CPU共享網絡。 peer組提供細分網絡成抽象的區域來提供內在范圍機制(implicit scoping mechanism)。比如,當搜索一個組內容的時,peer組可以界定定義一個搜索范圍。
    3. 創建一個監視環境。peer組允許一個peer為了任何目的去監視一組peer(比如,心跳,traffic introspection或者accountability)。peer組也可以構建一個父子層次結構,其中任何一個組都有一個唯一的父親。查詢請求能偶在這個組中傳播。對于這個組中的廣告也可以在其父組中公開,當然也包裹這個組本身。
    peer組提供了一組服務成為peer組服務。在JXTA中敵營了一個核心peer組服務集合。兩個peer如果要通過一個服務進行交互,他們配需位于同一個peer中。
        核心的組服務有如下:
    1. 發現服務(Discovery Service)。本服務被組中的peer用來查詢per組資源,比如peer,peer組,通道和服務等。
    2. 成員關系服務(Membership Service)。本服務被當前成員用來拒絕或接受一個新的組成員應用。一個peer想要加入到一個group前,首先要確定一個當前的成員,并請求加入。當前成員的集合可以拒絕或者接受某個想加入的應用(application)。本服務可能會發起一個所有peer或者指定組代表的一次投票來決定是否接受或者聚居新的成員應用。
    3. 訪問服務(Access Service)。使用訪問服務可以用來驗證一個peer對另一個peer的請求(request)。如果訪問被允許,那么接受請求的peer會提供給請求peer關于該請求所要知道的信息的信任和相關信息。(注意,在peer組中,不是所有的行為(action)都需要通過訪問服務的檢查,只有那些在某些peer中被限制的行為在需要調用時,才被檢查。)
    4. 管道服務(Pipe Service)。本服務用于在peer組成員間的鏈接管道的建立和管理。
    5. Resolver服務。本服務用來發送一般的查詢請求到其他的peer。peer可以定義和交換請求以便發現任何需要的信息(比如一個服務的狀態或者一個管道端點的信息。)
    6. 監視服務(Monitoring Service)。本服務用來讓一個peer監視本組中的其他成員服務。
        不是所有上面提到的服務都必須要被每個peer實現。一個peer組可以自由的實現那些它認為有用的服務,并可以依賴于默認的Net Peer Group來提供非關鍵核心服務的一般實現。
    3.Network Services。peer之間可以協作并通信以發布,發現和啟動網絡服務。peer可以發布多個服務。peer通過Peer Discovery Protocol來發現network service。在JXTA協議中組織了兩個層次上的network service。
    • Peer Service。一個peer service只有當peer公布了自己的service時才能被訪問。如果這個peer失敗了,那么它的service也失敗了。不同的peer可以運行某個服務的多個實例,但每個實例都必須公開自己的廣告(advertisement).
    • Peer Group Service。peer組服務是這個組中成員所運行服務的實例的集合的組織形式,其中這些實例是互相合作的。如果其中任何一個peer失敗了,那么這個 peer組服務將不會收到影響(假定這個服務可以從其他peer獲得)。peer group服務通過peer 組廣告的以部分來發布。
        服務可以是事先被安裝到peer上或者通過網絡安裝的。為了真正的運行一個服務,peer必須為定位一個適合當前peer運行環境的一個實現。這個從網絡上查找,下載和安裝一個服務的過程很類似于在Internet上搜索一個Web頁面,取回這個頁面然后再安裝需要的插件的過程。
    4.Modules。JXTA的module用來描述任何一段用來實現JXTA world中一個行為的“代碼”的抽象表示(Abstraction)。Network Service就是在一個peer上實現的行為的一個最一般的例子。這個Module Abstraction不一定特指什么“代碼”,它可以是一個Java類,也可以是Java jar,或者動態鏈接庫dll,一個XML消息或是一個腳本。這個module的行為交給了module的實現者。對于一個實例(instance), module表示了一個網絡服務(network service)在不同平臺上的不同實現,這些平臺比如說在java平臺,MS windows平臺,Solaris 平臺。
        Module允許peer實現一個新的行為,通過提供了一個一般的抽象。當peer瀏覽或者加入一個peer組時,他可以查找新的其打算實現的行為。比如,當加入一個peer組后,一個peer可能必須學習新的搜索服務,這個服務只能在本peer組中使用。為了加入到這個組,這個peer必須實現這個新的搜索服務。這個module框架可以啟動平臺無關行為的表示(representation)和廣告(advertisement)。并允許peer描述和實現任何形式這個行為(behavior)的是實現。比如,一個peer使用java或者c實現一個行為的實現。
    & amp; nbsp;   描述和公告一個平臺獨立的行為的能力能有有效的支持peer組包含異構的peer。module的廣告可以使JXTA的peer能夠采用平臺獨立的方式描述一個行為。JXTA平臺使用module廣告來自描述。
        module抽象(Module abstractIon)包括一個module class,module specification和一個moduleimplementation。
    • Module Class。module class主要用于廣告一個行為(behavior)的存在。這個class的定義表述了一個期望的行為和一個期望的對所支持的module的綁定。每一個module class都有一個唯一的ID,成為MoudleClassID
    • Module Specification。Module Specification主要用于訪問這個module。它包含了訪問或者啟動這個module的所有必要的信息。比如,一個服務,他的module specification可能包含了一個用于和其他服務相通信的管道的廣告。一個module specification用于提供module class所指明的功能。對于一個module class可能有多個module specification。每一個module specification都有一個唯一的id,ModuleSpecID。ModuleSpecID包含了ModuleClass ID,并指明了所使用的module class。一個module specification暗含了對網絡的兼容性。對于一個給定的module specification的所有實現都必須使用相同的協議,這些實現都需要是兼容的,即使使用不同的語言實現的。
    • Module Implementation。Module Implement是一給定module specification的實現。對于一個module specification可以有多個module implementation。每一個module implementation都包含了它所實現的與specification相關聯的ModuleSpecID。
        Module可以被peer組服務使用,也可以被獨立的服務所使用。JXTA服務通過module abstraction來區別存在的服務(他的Module Class),服務的specification(Module Specification),或者服務的實現(Service Implementation)。所有的這些都有一個聯合的廣告,并且可以通過其他JXTA peer來公告和發現的。作為一個例子,考慮JXTA的發現服務。它包含一個唯一的ModuleClassID,標識了他作為一個發現服務——他的抽象功能。對于這個發現服務可以有多個不同的規范(Specification),并伴隨著不同的實現。對于組的大小和在網絡中的傳播方式可以使用不同的裁剪策略。每一個Specification都有唯一的MdouleSpecID,其中指明了發現發現服務的ModuleClassID。對于每個規范,都可能有多種實現,每種實現都包含了相同的ModuleSpceID。
        總之,對于一個給定的module Class都可能有多種規范,這些規范可能是完全不同的。然而任何給定規范的所有實現都是假定可以互相兼容的。
    posted @ 2007-05-19 23:11 Long Long Ago 閱讀(960) | 評論 (0)編輯 收藏

    主站蜘蛛池模板: 亚洲高清在线视频| 日本免费中文字幕在线看| 亚洲一级片在线播放| 91成人免费福利网站在线| 亚洲伦乱亚洲h视频| 久久久久亚洲AV成人片| 免费人成毛片动漫在线播放| 在线精品亚洲一区二区小说| 亚洲精品国产情侣av在线| 亚洲av无码一区二区三区在线播放| 国产人成免费视频网站| 91亚洲精品自在在线观看| 中文字幕免费在线视频| 亚洲色精品88色婷婷七月丁香| 中国性猛交xxxxx免费看| 亚洲AV日韩精品久久久久久| 99久9在线|免费| 亚洲一级特黄特黄的大片| 免费无码不卡视频在线观看| 国产精品亚洲av色欲三区| 你懂的免费在线观看网站| 亚洲av鲁丝一区二区三区| 1000部国产成人免费视频| 亚洲小说图区综合在线| 免费国产高清视频| 99视频在线观看免费| 亚洲白色白色在线播放| 免费网站看v片在线香蕉| 一级免费黄色毛片| 亚洲国产二区三区久久| 最新中文字幕电影免费观看| 亚洲黄色在线观看网站| 免费无码AV片在线观看软件| 免费人成动漫在线播放r18| 亚洲熟妇无码另类久久久| 亚洲一区免费在线观看| 国产精品亚洲а∨无码播放不卡 | 免费在线观看亚洲| 久久国产乱子精品免费女| 亚洲乱码在线观看| 国产日韩成人亚洲丁香婷婷|