2016-09-17 156 views
3

所以我想了解一般情況下的網絡連接,尤其是在這個時間點的套接字。我正在使用Python套接字庫來處理事情。socket.connect()在內部做什麼?

我在互聯網上遇到很多例子,通過簡單的ECHO服務器演示TCP和UDP套接字。

對於TCP同行的資源表明TCP回聲客戶端使用

socket_object.connect()連接到了它的服務器和交換數據。 同樣,TCP回顯服務器使用 listen()和accept()來處理與客戶端的連接和交互。

問題

  1. 現在這些資源提的是它是一個TCP連接,並面向因此 連接(我的理解概念)。請幫助 我明白它是什麼意思說連接導向 執行明智嗎?那麼connect(),listen()和accept()API如何幫助實現這一點?
  2. 同樣,對於UDP對應端,resources建議 UDP回顯客戶端不使用任何connect(),UDP服務器也不使用任何listen()或accept()方法。這有助於實現 無連接行爲。請幫助我瞭解具體到底是什麼?或者 可能是答案,上面的問題1也會幫助我理解這個 。

  3. 此外,在我們的情況下UDP回顯客戶端,爲什麼它不需要 綁定到套接字。即使能夠將數據發送到遠程服務器,它是否仍然不需要套接字端點來實際發送數據並在服務器將其發回時接收數據?或者,本質上,我想,理解bind()在內部會做什麼會幫助我理解這一點。

回答

1

請幫我理解這是什麼意思實際上說的面向連接的實現明智?

這意味着TCP協議依賴於打開的連接來工作。換句話說,必須是是一個開放的連接,通過它將通過套接字發送的消息包發送出去。

connect(),listen()和accept()API如何幫助實現這一目標?

我從來沒有使用這個Python套接字庫,但我認爲關於套接字的基本知識足以解釋這一點。 connect方法用於打開我在前面的答案中提到的非常相同的連接。服務器使用其他兩種方法接收通過此打開的連接從客戶端發送的消息。

同樣,對於UDP對應方,資源建議UDP回顯客戶端不使用任何connect(),也不使用任何listen()或accept()方法。這有助於實現無連接的行爲。請幫助我瞭解具體到底是什麼?

您可能知道與TCP協議不同的UDP協議並不依賴打開的連接來工作。這意味着,信息包「原子」(相互獨立)發送,這將使以前的方法沒用。如您在您的問題中鏈接的文檔中所述:

由於沒有連接,服務器本身不需要監聽和接受連接。它只需要使用bind()將其套接字與端口相關聯,然後等待單個消息。

這意味着所有使用UDP進行套接字通信的服務器必須執行的操作是註冊期望套接字消息的端口,該消息將從客戶端發送並通過recvfrom方法接收。客戶端也使用這種方法從服務器接收消息。

即使能夠將數據發送到遠程服務器,它是否仍然不需要套接字端點來實際發送數據,並且在服務器發回數據時也會接收數據?

該API可能不公開一個方法來執行該客戶端,因爲客戶端動態選擇端口並阻止其他程序成爲該端口中的服務器,或者至少它們應該。

+0

謝謝,這是一個體面的答案是試圖解釋一些事情,但也只從概念的抽象角度來看這是一件好事,我已經相當明白了。 但是,如果你仔細看一下我的問題,也許我可以做的更好,以強調它,它是關於要求它的內部。例如,從實現的角度來看,如何實現面向連接?我的意思是有一些令牌等,類似於會話cookie,例如在web應用等情況下?如果你能對此有所瞭解,將不勝感激。 – qre0ct