首先,一般的HTTP協議的請求,都是在TCP的3次握手之后再進行數據傳輸的。在這3次握手之后就已經“建立起了連接”??梢哉f在3次握手的時候就已經確定了源和目標的ip+端口(如果是IPv4 Internet Protocol version 4的話)。
那具體是怎么知道的呢?
1.源和目標之間發送的是數據包,是一段數據流。
2.這個IP包有自己的數據結構,如下:
*轉載自http://blog.csdn.net/ns_code/article/details/29382883 *
3.而其中IP頭部的數據結構如下:
轉載自http://www.51testing.com/html/66/138366-216709.html
4.TCP頭部的數據結構如下:
5.可以看到,IP頭部結構中的Source Address和Destination Address,長度為32bit(最多可表示256的4次方),即源和目標的IP地址。
6.TCP頭部結構中的源端口號和目的端口號,就標識了客戶端和服務器中具體的某一個進程。
有了這些數據就能唯一確定源和目標,這樣服務器的結果就能只響應給我,而不是響應給你。
另外,我們常說的“3次握手之后就建立起了連接,就能傳數據了”,這個“建立起了連接”是啥意思?
“建立起了連接”是個籠統的說法,更準確的版本是“建立起了傳輸數據的環境”或者說“接收方和發送方,都知道自己要向什么地方發送數據,而且能夠保證自己所得到的數據,就是發送方發的數據”。
這個環境至少需要兩個條件:
- 源和目標的IP+端口號
- 源和目標雙方都確認了起始序列號
第一點其實就是上面說的,第二點是這樣:
首先
TCP 會通過三次握手來完成連接建立,具體過程是這樣的:
1.客戶端首先向服務端發送一個 SYN 包和一個隨機序列號 A
2.服務端收到后會回復客戶端一個 SYN-ACK 包以及一個確認號(用于確認收到 SYN)A+1,同時再發送一個隨機序列號 B
3.客戶端收到后會發送一個 ACK 包以及確認號(用于確認收到 SYN-ACK)B+1 和序列號 A+1 給服務端
轉載自https://objccn.io/issue-10-6/
有了這些序列號,源和目標才能夠保證數據的有效性,也就是我們說的“建立起了連接”
。