2015-10-20 79 views
0

我想這是以前曾被問及的答案,但我不知道要搜索什麼才能找到它。這發生在我身上,作爲您在計算機網絡大學課程中學習的東西 - 我從來沒有拿過的東西。如果有人能指出我的答案,那會很好。網絡/ Golang - 對「GET」請求的解析

所以,問題是:

在許多語言中,像圍棋和JavaScript,它是相對簡單的做一個「GET」請求通過HTTP/HTTPS的API。但是表面之下發生了什麼,在一個相對較高層次的描述中呢?

我問,因爲我需要一個更好的理解,以掌握如何處理各種錯誤,我收到時,事情不應該如他們應該的行爲。

對於我打算回答的一種想法,我會參考Golang的http調用方法。在Golang中,您可以導入net/http包並撥打電話http.Get("http://www.example.com")。但是你也可以指定一個「客戶端」,你可以配置它來擁有特定的定製頭文件等等。你可以在客戶端中指定一些更復雜的東西,比如使用的傳輸器等等,而我對它並不感興趣的東西除非它解決了我的問題。

基本上,這歸結爲:Go是完全併發的,在我的情況下是並行的。我每秒向一個API發出約300個請求。 golang docs的建議是客戶端對於併發使用是安全的,所以應該只實例化一次 - 實質上,我有一個全局客戶端,通過它來傳輸每個請求。

如果我得到一個錯誤,指出連接已被殺死,是否會影響一個請求,很多請求,我是否必須對客戶端做任何事情以獲得另一個連接?

此外,它是一次一個連接請求,還是有一個新的連接爲每個請求?請求之間的連接是否持續,什麼決定了它們何時死亡?

這個問題可能很漫長,可能沒有意義。如果任何人都可以回答它的任何部分,那將非常感激。

+1

你似乎只是問「http工作如何」? go客戶端處理http/1.1(和go1.6中的http/2)。如果你瞭解協議,客戶的行爲就會如此。這不是http的細節教程的地方。如果你想討論如何使用客戶端,討論一下*郵件列表就是一個更好的論壇,但在這裏你應該提出具體的問題。 – JimB

回答

3

網絡:

dns-> ip-> tcp-> http。 DNS將域名解析爲一個IP地址; tcp添加一個端口(如HTTP默認80)等; http添加標題,表單數據等。最後你的http數據包從你的網絡適配器發送並經過互聯網路由器的處理,然後到達正確的http服務器。

網/ HTTP:

我們必須回答golang文檔中所有的傳輸層的問題,主要是this。請仔細閱讀。

更新:

連接錯誤只是影響一個請求。即使多個請求使用相同的tcp連接,因爲請求響應對一拜一,所以一個連接錯誤永遠不會使兩個請求失敗。

+1

好的,謝謝!但是,有一個問題,當錯誤指出「連接已關閉」時,是指單個請求的連接還是更持久,處理多個「GET」? – bawjensen

+0

@bawjensen:連接可能是持久的,也可能不持久。這取決於客戶端在協議級別處理,您不必擔心。 – JimB

+0

你說得對,我不**有擔心。但是由於我的連接出現錯誤,我花了很多時間在HTTPS連接周圍建立密碼,可能如果我可以根據特定情況優化連接的行爲,我可以消除這些錯誤並加快我的代碼。 – bawjensen