計算機網路面試問題總結

豎橫山發表於2021-07-23

TCP三次握手四次回收

.伺服器監聽:
int main(int argc, char const *argv[])
{
    int fd = socket(AF_INET, SOCK_STREAM, 0);
    bind(fd, ...);//繫結埠
    listen(fd, 128);
    accept(fd, ...);
    ...
}
在伺服器 listen 的時候,主要是進行了全/半連線佇列的長度限制計算,以及相關的記憶體申請和初始化

二.客戶端發起SYN:
int main()
{
    fd = socket(AF_INET, SOCK_STREAM, 0);
    connect(fd, ...);
    ...
}
客戶端在 connect 的時候,把本地 socket 狀態設定成了 TCP_SYN_SENT,選了一個可用的埠,接著發出 SYN 握手請求並啟動失敗重傳定時器

3.服務端響應SYN
伺服器響應 ack 是主要工作是判斷下接收佇列是否滿了,滿的話可能會丟棄該請求,否則發出 synack。申請 request_sock 新增到半連線佇列中,同時啟動失敗重傳定時器

4.客戶端相應SYNACK
客戶端響應來自服務端的synack時,清除了connect時設定的重傳定時器,把當前的socket狀態設定為ESTABLISHED,開啟保活計時器後發出第三次握手的ack確認

5.伺服器響應ACK
伺服器把當前半連線佇列元素刪除,建立新的sock後加入到全連線佇列中,socket狀態設定為ESTABLISHED

6.伺服器accept
accept的重點工作就是從全連線的佇列中取出一個返回給使用者程式

計算機網路面試問題總結

HTTP1.0/1.1/2.0/HTTPS

HTTP1.0 短連線,瀏覽器每次請求都要和伺服器建立一個TCP連結,請求完成立即斷開TCP連結,每個圖片,js,css檔案都要建立一次TCP連結,影響效能和頻寬
HTTP1.1 預設支援長連線,一個網頁內所有html,js,css,image...請求共享一個TCP連線,還允許不用等上一次請求返回就發出下一次請求
connection 預設 keep-alive,如果不希望使用長連線則HEADER 設定 connection:close,無論是request header還是 response header中包含了connection:close,tcp連線都會馬上中斷
提供了了身份認證,狀態管理,cache快取機制的請求頭和響應頭
支援斷點續傳
HTTP2.0
多路複用
二進位制分幀
首部壓縮
服務端推送
HTTPS
HTTP是明文傳輸的,對於敏感資料,及其不安全
使用HTTPS,需要去認證機構購買頒發的電子證照,同時產生一對公鑰和私鑰,也可以用let's encrypt生成免費的HTTPS證照
HTTPS牽手過程
1.瀏覽器請求HTTPS網址,連結到伺服器443埠(預設443)
2.伺服器響應瀏覽器請求,將證照傳遞給客戶端,證照包含公鑰和頒發機構資訊,公司資訊,有效期等,chrome瀏覽器點選位址列的鎖標誌可以檢視網站的證照
3.客戶端解析證照並對其進行驗證,如果證照是假的,或者域名不一致,或者已經過期,則瀏覽器會彈出一個警告:您的連線不是私密連線,攻擊者可能會試圖從localhost竊取您的資訊...
如果證照沒問題,瀏覽器取出公鑰,然後生成一個隨機KEY,並用公鑰加密,然後傳送給伺服器
4.伺服器接收到公鑰加密後的隨機KEY,用私鑰解密,自此安全連線建立完成
5.
本作品採用《CC 協議》,轉載必須註明作者和本文連結
遇強則強,太強另說

相關文章