tcp首部只有埠號沒有ip地址,那麼網路層怎麼知道目的ip地址的呢?

比如http請求,應用層dns就解析出了目的ip地址,但是沒記錄在傳輸層的tcp首部中?下一層卻知道了?(正在學計算機網路,這個疑惑始終想不明白)


想必讀者已經知道,瀏覽器發送HTTP請求,最終會以HTTP報文到達伺服器,伺服器理解HTTP報文,會做出響應的動作。從這個意義上來說,瀏覽器是以HTTP報文與伺服器間接打交道,這是最終目標。

瀏覽器 --------HTTP --------伺服器

此外,瀏覽器在本地還有一個直接打交道的角色,瀏覽器通過Socket與本地TCP直接打交道,這是實現最終目標的手段,注意手段與目標的區別,目標是我們最終的目的無非通過HTTP拉下來一個網頁,而手段是我們採取的具體步驟。

如下方示意圖:

瀏覽器
|
Socket
|
TCP

首先瀏覽器通過DNS解析得到伺服器的IP,調用Socket Connect()來告訴TCP,自己想和伺服器IP連接,否則TCP又不是瀏覽器肚子里的蛔蟲,TCP無法知道,所以這是最最起碼的入口參數。此外,瀏覽器還應該告訴TCP,伺服器的埠,如果用戶不輸入,採用預設80埠;如果用戶輸入則使用用戶輸入埠。

至此,TCP擁有了封裝TCP頭一切必要信息

Destination Port
Source Port

封裝成TCP報文發送給IP來封裝IP頭、並路由處理,同時會把Destination IP / Source IP 傳遞給IP層,這個很簡單,不再展開。

總結一下:瀏覽器的一生需要和兩個角色打交道,一個是遠端的伺服器,使用業界標準HTTP協議;另一個是本地的TCP,需要把目的IP/Port傳遞給TCP,TCP再傳遞給IP。


題主需要深入思考一下分層模型的意義和價值。


http 拿到 dns 返回的 ip 之後,會通過 tcp 建立一個長連接,建立連接需要 ip 和 port,port 放在 tcp 的 header 中,ip 則是放在下一層網路層 IP Layer 的 header 中。
傳輸層不負責定址,所以和 ip 地址無關,自然不需要再 header 中存放 ip 信息。


替 @MrPeak 補上圖


我想題主可能還是停留在理論上,確實,如果如書本上說的,每一層只管自己要的,dns解析的ip地址確實沒法發到網路層,因為傳輸層tcp關注的頭數據並不包括ip。但題主也知道,這樣就沒法工作了,所以實現上dns解析出ip地址後建立socket,然後進行connect系統調用的時候,ip地址實際上是作為參數傳進去了,只不過tcp頭封裝的時候沒放進去,而是放在ip頭裡面去了,這些東西書本上是講標準,講分層,但實現上可能就是程序。所以題主可以看看unix的socket編程,然後就不會陷入一種定式上了。


因為IP層有


你是想問DNS返回WEB伺服器的IP地址沒有記錄在TCP頭部,瀏覽器如何知道WEB伺服器的IP地址?

如果是這個意思,WEB伺服器的IP地址是作為數據,一般封裝在UDP包里返回給瀏覽器。這個udp包IP頭部的IP地址是DNS伺服器的,不會是要訪問的WEB伺服器的IP地址。

拿到WEB伺服器的IP地址以後,再用IP地址加埠發起會話。


IP 地址在Network Layer的Datagram的頭(Header)里,也就是圖中的Hn
其實,OSI每一層都是對上一層的封裝。也就是說,上面的一層變成了下面一層的body
對TCP來說,他不需要存儲IP,因為下一層的Datagram頭裡面有IP。


因為在http或者DNS協議封包的時候,在其上層已經封裝了TCP協議,TCP協議封裝中包含了對應的目的埠和源埠,TCP之前又封裝了IP協議,IP協議中包含了源IP地址和目的IP地址。這樣就對應了完整的一個Socket。


不明白問題


tcp連接建立的時候需要ip和port,會保存在socket


推薦閱讀:

SCTP同時具有TCP和UDP的優點,但是為什麼應用不廣?
如何正確關閉 tcp 連接?
同一網段內的兩台主機通信是否需要路由器?
假設網路中出現了一個全是FFFF的IP數據包,那這個數據包將會如何被處理?

TAG:計算機網路 | HTTP | TCPIP |