TCP如何保持長連接,並識別不同請求的?

我有一個疑問,在網上找不到合適的解釋.大家幫忙解釋一下吧.
tcp連接建立後,默認的被設置為保持長連接,假如我有20個機器同時訪問一個網頁.他們都保持了tcp連接,那他們用各自的沒有被關閉的連接時,是怎麼被識別到各自的連接呢?對協議連接不大熟悉,望得到解答.


TCB: Transmission Control Block 來唯一識別一個TCP連接,用五元組來識別一個TCP連接太不方便。


更詳細的解釋(回@oopsdrc評論):


TCP進程從IP進程取走數據,這個數據包含IP Header + IP Payload,TCP進程先計算CRC,如何計算CRC?CRC覆蓋了以下欄位,其中包含IP頭12個位元組:

[IP Source Address + IP Destination + Total Length + Reserved + Protocol ] + TCP Header + TCP Payload

要先把TCP Header里原始的CRC值0 處理,比較新計算的CRC和原始的CRC是否一致,如果不一致,丟棄;如果一致,則需要把TCP Payload提交給特定的session ID,這個session ID在不同的操作系統上有不同的名稱,在cisco IOS 我們稱之為TCB,這個TCB只在本地有意義。

最初TCP進程在用戶進程調用socket的時候,建立了一個映射關係,五元組 &<----&>session ID (TCB):


[IP Source Address + IP Destination + Source Port +Destination Port+Protocol ] &<---&>session ID (TCB)

很顯然,五元組的作用是從IP進程取來數據使用的,因為IP Header + TCP Header 沒有這樣的session ID,只有五元組做KEY值;有了這個KEY值就可以唯一地映射到session ID,於是把TCP Payload 提交給session ID 所對應的session。

所以無論是session ID, 還是TCB,只是名稱不同,其實是一個意思。


一個連接是通過伺服器地址和埠還有客戶端地址和埠來識別唯一連接的


建議你讀一下三卷本的《TCP/IP 協議詳解》和相關的更底層的東西。


1. TCP長連接保持:KeepAlive。TCP協議的實現里有一個KeepAlive機制,自動檢測能否和對方連通並保持連接。
2. TCP識別不同的請求:每個連接建立時,都會保存一個唯一的套接字,有了這個套接字,你就知道對方的IP地址、埠號等信息。這樣,通過這個套接字,就可以向指定方發送信息了。

如果是網路初學者,麻煩看《圖解TCP/IP》第五版。
如果有網路基礎,請看三卷《TCP/IP詳解》


TCP保持長連接,會用到KeepAlive心跳機制,發送端會在規定時間內,向接收端發送一個探測報文段,看對方是否還在連接狀態,一般應該是兩個小時吧沒記錯的話,至於怎麼識別各自的連接,肯定是用套接字,通過套接字,你可以知道IP,埠等信息,對,就是這樣。


客戶端連接服務端監聽埠的時候,客戶端操作系統也是要耗費一個埠的。
所以通過客戶端IP:連接埠,服務端IP:監聽埠,就能夠區分不同的TCP連接。
所以客戶端多線程連接同一個服務端的監聽埠做壓力測試的時候,最大連接數是受客戶端操作系統所能支持最大埠數限制的,之前Windows下好像是65535。


套接字 套接字 套接字


推薦閱讀:

你為什麼不用unity引擎?
如何通過新浪微博API抓取大量用戶信息?
關於Python IDE如何選擇?
紅白機時代的fc遊戲卡帶是類似於u盤的存儲設備嗎?這種遊戲是用什麼語言寫的?
希望自己做個機器人出來,應該對哪些專業知識有所了解?

TAG:編程 | 通信 | 計算機網路 | TCPIP | TCP |