首先邻邮,一般的HTTP協(xié)議的請(qǐng)求竣况,都是在TCP的3次握手之后再進(jìn)行數(shù)據(jù)傳輸?shù)摹T谶@3次握手之后就已經(jīng)“建立起了連接”筒严〉と可以說(shuō)在3次握手的時(shí)候就已經(jīng)確定了源和目標(biāo)的ip+端口(如果是IPv4 Internet Protocol version 4的話)。
那具體是怎么知道的呢萝风?
1.源和目標(biāo)之間發(fā)送的是數(shù)據(jù)包嘀掸,是一段數(shù)據(jù)流。
2.這個(gè)IP包有自己的數(shù)據(jù)結(jié)構(gòu)规惰,如下:
*轉(zhuǎn)載自http://blog.csdn.net/ns_code/article/details/29382883 *
3.而其中IP頭部的數(shù)據(jù)結(jié)構(gòu)如下:
轉(zhuǎn)載自http://www.51testing.com/html/66/138366-216709.html
4.TCP頭部的數(shù)據(jù)結(jié)構(gòu)如下:
5.可以看到睬塌,IP頭部結(jié)構(gòu)中的Source Address和Destination Address,長(zhǎng)度為32bit(最多可表示256的4次方)歇万,即源和目標(biāo)的IP地址揩晴。
6.TCP頭部結(jié)構(gòu)中的源端口號(hào)和目的端口號(hào),就標(biāo)識(shí)了客戶端和服務(wù)器中具體的某一個(gè)進(jìn)程贪磺。
有了這些數(shù)據(jù)就能唯一確定源和目標(biāo)硫兰,這樣服務(wù)器的結(jié)果就能只響應(yīng)給我,而不是響應(yīng)給你寒锚。
另外劫映,我們常說(shuō)的“3次握手之后就建立起了連接,就能傳數(shù)據(jù)了”刹前,這個(gè)“建立起了連接”是啥意思泳赋?
“建立起了連接”是個(gè)籠統(tǒng)的說(shuō)法,更準(zhǔn)確的版本是“建立起了傳輸數(shù)據(jù)的環(huán)境”或者說(shuō)“接收方和發(fā)送方喇喉,都知道自己要向什么地方發(fā)送數(shù)據(jù)祖今,而且能夠保證自己所得到的數(shù)據(jù),就是發(fā)送方發(fā)的數(shù)據(jù)”。
這個(gè)環(huán)境至少需要兩個(gè)條件:
- 源和目標(biāo)的IP+端口號(hào)
- 源和目標(biāo)雙方都確認(rèn)了起始序列號(hào)
第一點(diǎn)其實(shí)就是上面說(shuō)的千诬,第二點(diǎn)是這樣:
首先
TCP 會(huì)通過(guò)三次握手來(lái)完成連接建立耍目,具體過(guò)程是這樣的:
1.客戶端首先向服務(wù)端發(fā)送一個(gè) SYN 包和一個(gè)隨機(jī)序列號(hào) A
2.服務(wù)端收到后會(huì)回復(fù)客戶端一個(gè) SYN-ACK 包以及一個(gè)確認(rèn)號(hào)(用于確認(rèn)收到 SYN)A+1,同時(shí)再發(fā)送一個(gè)隨機(jī)序列號(hào) B
3.客戶端收到后會(huì)發(fā)送一個(gè) ACK 包以及確認(rèn)號(hào)(用于確認(rèn)收到 SYN-ACK)B+1 和序列號(hào) A+1 給服務(wù)端
轉(zhuǎn)載自https://objccn.io/issue-10-6/
有了這些序列號(hào)徐绑,源和目標(biāo)才能夠保證數(shù)據(jù)的有效性邪驮,也就是我們說(shuō)的“建立起了連接”
。