搞懂傳輸層,網(wǎng)站通信不再迷糊
做網(wǎng)站搭建時(shí),很多人只盯著前端頁(yè)面和后端代碼,卻忽略了數(shù)據(jù)是怎么從用戶瀏覽器傳到服務(wù)器的。比如你點(diǎn)一下“提交訂單”,這個(gè)請(qǐng)求是怎么準(zhǔn)確送達(dá)服務(wù)器,并且還能收到“下單成功”回應(yīng)的?背后靠的就是傳輸層協(xié)議棧在干活。
TCP 和 UDP 是什么角色?
TCP 像個(gè)靠譜快遞員,送貨上門還讓你簽收,保證不丟件、不亂序。網(wǎng)頁(yè)加載、登錄表單這些重要操作都用它。而 UDP 更像廣播喇叭,喊完就完事,不確認(rèn)你聽沒聽到,適合視頻直播、語音通話這類對(duì)速度要求高、偶爾丟一兩幀也無所謂的場(chǎng)景。
舉個(gè)例子:你做個(gè)在線客服系統(tǒng),如果消息老是延遲或者亂序,客戶肯定炸鍋。這時(shí)候就得用 TCP 來確保每條消息都穩(wěn)穩(wěn)當(dāng)當(dāng)送到對(duì)方手里。
動(dòng)手看看協(xié)議怎么工作
光看理論不夠直觀,可以用 tcpdump 抓包觀察。比如你在本地啟動(dòng)一個(gè)簡(jiǎn)單的 HTTP 服務(wù):
python3 -m http.server 8000
然后打開瀏覽器訪問 http://localhost:8000,同時(shí)在終端運(yùn)行:
tcpdump -i lo port 8000
你會(huì)看到一堆 SYN、ACK 的交互過程,這就是 TCP 建立連接的“三次握手”。別被術(shù)語嚇住,多抓幾次包,對(duì)照著流程圖看,慢慢就熟悉了。
常見誤區(qū)提醒
有人覺得“我用框架寫網(wǎng)站,不用管底層協(xié)議”。但真出了問題,比如頁(yè)面加載卡頓、接口超時(shí),不懂傳輸層就會(huì)一頭霧水。明明代碼沒問題,可能是 TCP 重傳太多,或者是 UDP 丟包嚴(yán)重導(dǎo)致音視頻卡頓。
還有人把 WebSocket 當(dāng)成獨(dú)立于 TCP 的存在,其實(shí)它默認(rèn)還是跑在 TCP 上的。想實(shí)現(xiàn)低延遲推送,得理解底層傳輸機(jī)制,不然優(yōu)化無從下手。
實(shí)用學(xué)習(xí)資源推薦
入門可以先看《計(jì)算機(jī)網(wǎng)絡(luò):自頂向下方法》,里面用 HTTP 請(qǐng)求帶出 TCP、UDP 的區(qū)別,讀起來不枯燥。動(dòng)手派推薦在 Linux 或 macOS 上用 netcat 模擬簡(jiǎn)單通信:
# 啟動(dòng)一個(gè)監(jiān)聽端口
nc -l 9999
# 另開終端連接它
nc localhost 9999
兩邊打字就能通,關(guān)掉服務(wù)再試 UDP 模式,體驗(yàn)一把“發(fā)了就不管”的感覺。
網(wǎng)上也有不少 Wireshark 抓包教程,搜“TCP 三次握手 抓包實(shí)例”能直接看到彩色的數(shù)據(jù)流,比純文字好懂多了。
搭建網(wǎng)站不只是拼湊組件,理解傳輸層協(xié)議棧,才能讓服務(wù)穩(wěn)定跑起來。遇到網(wǎng)絡(luò)問題也不至于只會(huì)重啟服務(wù)器碰運(yùn)氣。