1. 程式人生 > >一個網路請求/響應發生時,都經過哪些?瀏覽器輸入查詢,伺服器響應結果,是如何進行的?TCP/IP 分層協議,埠號作用

一個網路請求/響應發生時,都經過哪些?瀏覽器輸入查詢,伺服器響應結果,是如何進行的?TCP/IP 分層協議,埠號作用

 

 

在網路上,通訊的雙方通常都是要經過多臺計算機或者網路裝置中轉才能連線到對方。而在進行中轉時,會利用下一站中轉裝置的MAC地址來搜尋下一個中轉目標,這時我們就是靠ARP協議來進行處理。

兩張圖,完美解析:

資料來源:OSI七層與TCP/IP五層網路架構,個人理解,通過一個http請求的全過程,分析在協議棧中的流轉過程

資料來源:OSI七層與TCP/IP五層網路架構詳解

具體互動關係:待更新。

 

三次握手:為什麼還需要第三次握手呢?

      第三次握手主要是防止已經失效的連線請求又傳送到伺服器端造成錯誤

四次揮手:為什麼要四次揮手呢?

      因為資料的傳輸是全雙工的,即資料的傳輸是雙向的。當瀏覽器停止給伺服器傳送資料時,伺服器有可能還在給瀏覽器傳送資料。所以,先發送ACK,表示我已經收到請求。伺服器需要等自己的資料傳輸完成後,再告訴瀏覽器,傳送FIN請求。

埠號是什麼?有什麼用呢

當一臺電腦啟動了一個可以讓遠端其他電腦訪問的程式,那麼它就要開啟至少一個埠號來讓外界訪問。我們可以把沒有開啟埠號的電腦看作是一個密封的房間,密封的房間當然不可能接受外界的訪問,所以當系統開啟了一個可以讓外界訪問的程式後它自然需要在房間上開一個視窗來接受來自外界的訪問,這個視窗就是埠。


那麼為什麼要給埠編號來區分它們呢,既然一個程式開了一個埠,那麼不是外部資訊都可以通過這個開啟的埠來訪問了嗎?答案是不可以。為什麼呢?因為資料是用埠號來通知傳輸層協議送給哪個軟體來處理的,資料是沒有智慧的,如果很多的程式共用一個埠來接受資料的話,那麼當外界的一個數據包送來後傳輸層就不知道該送給哪一個軟體來處理,這樣勢必將導致混亂。

當伺服器接收到請求後:看下nginx.conf的配置

server {
    listen       80; #監聽80埠,接收http請求
    server_name  www.example.com; #就是網站地址
    root /usr/local/etc/nginx/www/huxintong_admin; # 準備存放程式碼工程的路徑
    #路由到網站根目錄www.example.com時候的處理
    location / {
        index index.php; #跳轉到www.example.com/index.php
        autoindex on;
    }   
 
    #當請求網站下php檔案的時候,反向代理到php-fpm
    location ~ \.php$ {        
        include /usr/local/etc/nginx/fastcgi.conf; #載入nginx的fastcgi模組
        fastcgi_intercept_errors on;
        fastcgi_pass   127.0.0.1:9000; #nginx fastcgi程序監聽的IP地址和埠
    }
}
www.example.com        |
      |
    Nginx        |
      |路由到www.example.com/index.php        |
      |載入nginx的fast-cgi模組        |
      |fast-cgi監聽127.0.0.1:9000地址        |
      |www.example.com/index.php請求到達127.0.0.1:9000
      |
      |
   等待處理...

 

當請求一個www.example.com具體流程如上。