2012-10-29 40 views
3

我跑在bash下面一行,在虛擬機上運行Red Hat 5:力連接到工作

for i in {1..100000}; 
     do telnet 10.10.10.105 41941; 
    done 

在某些時候,TELNET連接到端口,即使沒有人聽就可以了。它似乎是連接到它的自我? 當我啓動應用程序的客戶端時出現同樣的問題,沒有啓動服務器 - 客戶端成功連接到ip:端口。客戶端看起來是這樣的:

addr.sin_family = AF_INET; 
    addr.sin_port = htons(atoi(port)); 
    addr.sin_addr.s_addr = inet_addr(hostname); 

    some_while_loop 
    { 
     status = ::connect(sock, (sockaddr *)&addr, sizeof(addr)); 
     if (status == -1) 
     { 
      shutdown(sock, 2); 
      close(sock); 
      return false; 
     } 
    } 

我發現這篇文章:http://web.deu.edu.tr/doc/soket/在6.2其中指出,該連接將如果你成功了,以你在運行在同一臺機器。我的問題是,爲什麼會發生這種情況?這是硬件問題,還是紅帽內核正在使用的故障安全內核,或者是因爲我使用的端口(例如1025,我沒有這個問題)......?

回答

0

它與港口有關。啓動TCP連接時,對於客戶端,會挑選端口上限(32786+)的隨機未使用端口。然後通常的TCP handshake完成,只有一個叫simultanous啓動的特殊情況。這裏假定連接的兩端想要同時建立連接,請參閱下面的RFC中的圖。

您可以強制該行爲使用NCAT:

ncat -p 50000 127.0.0.1 50000 

這將使NCAT連接到127.0.0.1:50000,同時使用源端口50000。您可以立即獲得有效的連接,而無需預先偵聽傳入連接。


儘管什麼評論者說,這裏發生的情況稱爲點大initiiationRFC 793, Section 3.4,在那裏說是很好的說明:

同時開始只是稍微複雜一些,如圖所示如圖8所示。每個TCP從CLOSED到SYN-SENT循環到 SYN-RECEIVED到ESTABLISHED。

 TCP A           TCP B 

    1. CLOSED           CLOSED 

    2. SYN-SENT  --> <SEQ=100><CTL=SYN>    ... 

    3. SYN-RECEIVED <-- <SEQ=300><CTL=SYN>    <-- SYN-SENT 

    4.    ... <SEQ=100><CTL=SYN>    --> SYN-RECEIVED 

    5. SYN-RECEIVED --> <SEQ=100><ACK=301><CTL=SYN,ACK> ... 

    6. ESTABLISHED <-- <SEQ=300><ACK=101><CTL=SYN,ACK> <-- SYN-RECEIVED 

    7.    ... <SEQ=101><ACK=301><CTL=ACK>  --> ESTABLISHED 

       Simultaneous Connection Synchronization 

           Figure 8. 

我還校正第一段更清楚和精確。

+0

那麼,對SYN的回覆不是ACK,它是一個SYN + ACK,在連接完成之前,它必須被ACK'd。我認爲這裏的基本機制有些不同。 – EJP

+0

@EJP請看編輯答案,並重新考慮downvote/deletevote! –

+0

@JonasWielicki,同時啓動確實似乎是這種情況,因爲在連接上,地址和端口實際上並沒有被阻塞,所以connect()將它們視爲鏈接套接字的可行選項。作爲一個解決這個問題的方法,我發現你可以'getsockname(sock,&sock_addr,&addr_size)'檢查端口是否相同,從而關閉連接。如果服務器試圖使用相同的地址和端口,還可以使用setsockopt設置上面提到的套接字來重新使用地址(SO_REUSEADDR)。正確地感謝您的幫助 – user1783445