HTTP 協(xié)議的底層其實(shí)是由 TCP 協(xié)議和 IP 協(xié)議(簡(jiǎn)稱(chēng) TCP/IP)構(gòu)建的。但是我不打算教 TCP/IP,只教一些皮毛就夠用了。
TCP 傳輸控制協(xié)議(Transmission Control Protocol)
面試的時(shí)候頂多會(huì)問(wèn)兩個(gè)相關(guān)問(wèn)題,去看博客了解一下即可:
TCP 和 UDP 的區(qū)別是什么
簡(jiǎn)答:TCP 可靠、面向連接、相對(duì) UDP 較慢;UDP 不可靠,不面向連接、相對(duì) TCP 較快。搞定。-
TCP 的三次握手指的是什么
簡(jiǎn)答:每次建立連接前,客戶(hù)端和服務(wù)端之前都要先進(jìn)行三次對(duì)話(huà)才開(kāi)始正式傳輸內(nèi)容,三次對(duì)話(huà)大概是這樣的:1\. 客戶(hù)端:我要連接你了,可以嗎 2\. 服務(wù)端:嗯,我準(zhǔn)備好了,連接我吧 3\. 客戶(hù)端:那我連接你咯。 4\. 開(kāi)始后面步驟上面內(nèi)容足以應(yīng)付前端面試中關(guān)于 TCP 的考題 :)
如果你想更了解 TCP 可以看 此文,也可以買(mǎi)一本《TCP/IP 詳解(卷一)》(共三卷,先只買(mǎi)一卷即可)。
不過(guò)再?gòu)?qiáng)調(diào)一遍,這不是前端的內(nèi)容,以后的課程中我也不會(huì)再對(duì) TCP 有任何涉及,你只需稍微了解一下 TCP 即可。
IP 網(wǎng)絡(luò)協(xié)議(英語(yǔ):Internet Protocol)
只要你在互聯(lián)網(wǎng)中,那么你就會(huì)有一個(gè) IP。通俗上理解,IP 分為「內(nèi)網(wǎng) IP」 和「外網(wǎng) IP」,以下圖為例:
<figcaption style="margin: 0px; padding: 0px; box-sizing: border-box; display: block; text-align: center;">圖片</figcaption>
- 你從電信那里買(mǎi)來(lái)帶寬,一年一千多。
- 電信為你提供 DNS 服務(wù)。
- 你買(mǎi)了一個(gè)路由器,然后用電腦和手機(jī)分別連接路由器廣播出來(lái)的無(wú)線(xiàn) WIFI。
- 只要路由器連上電信的服務(wù)器,那么路由器就會(huì)有一個(gè)「外網(wǎng) IP」,比如「14.17.32.211」就是一個(gè)外網(wǎng) IP。這就是你在互聯(lián)網(wǎng)中的地址。
- 但是如果你重啟路由器,那么你很有「可能」被重新分配一個(gè)「外網(wǎng) IP」,也就是說(shuō) 你的路由器沒(méi)有「固定的外網(wǎng) IP」
- 你可以花每年幾千塊錢(qián)租用一個(gè)「固定的外網(wǎng) IP」,但是顯然不會(huì)這么浪費(fèi)錢(qián)。像騰訊、阿里這樣的大公司租用了很多外網(wǎng) IP,這樣才能對(duì)我們提供穩(wěn)定的服務(wù)。
- 但是有個(gè)問(wèn)題,你的路由器的外網(wǎng) IP 如果是14.17.32.211,那么你的手機(jī)和電腦的 IP 又是什么呢?答案是「內(nèi)網(wǎng) IP」
- 路由器會(huì)在你家里創(chuàng)建一個(gè)內(nèi)網(wǎng),內(nèi)網(wǎng)中的設(shè)備使用內(nèi)網(wǎng) IP,一般來(lái)說(shuō)這個(gè) IP 的格式都是 192.168.xxx.xxx。
- 一般路由會(huì)給自己分配一個(gè)好記的內(nèi)網(wǎng) IP,如 192.168.1.1
- 然后路由會(huì)給每一個(gè)內(nèi)網(wǎng)中的設(shè)備分配一個(gè)不同的內(nèi)網(wǎng) IP,如電腦是 192.168.1.2,手機(jī)是 192.168.1.3,以此類(lèi)推。
- 現(xiàn)在路由器有兩個(gè) IP,一個(gè)外網(wǎng) IP(14.17.32.211)和一個(gè)內(nèi)網(wǎng) IP(192.168.1.1)
- 內(nèi)網(wǎng)中的設(shè)備可以互相訪(fǎng)問(wèn)(比如你可以用電腦或手機(jī)進(jìn)入 http://192.168.1.1 來(lái)查看你的路由器),但是不能直接訪(fǎng)問(wèn)外網(wǎng),內(nèi)網(wǎng)設(shè)備想要訪(fǎng)問(wèn)外網(wǎng),就必須經(jīng)過(guò)路由器中轉(zhuǎn)。
- 外網(wǎng)中的設(shè)備可以互相訪(fǎng)問(wèn)(比如 qq.com 可以把首頁(yè)發(fā)送給你的路由器,你的路由器有外網(wǎng) IP),但是外網(wǎng)中的設(shè)備無(wú)法訪(fǎng)問(wèn)你的內(nèi)網(wǎng)設(shè)備(這很好理解,內(nèi)網(wǎng)是一個(gè)封閉的網(wǎng)絡(luò),外人進(jìn)不來(lái),所以實(shí)際上 qq.com 無(wú)法直接把首頁(yè)放送給你的電腦和手機(jī))
- 問(wèn)題來(lái)了,那 qq.com 是怎么把首頁(yè)發(fā)送到我的手機(jī)上的呢?答案是通過(guò)路由器來(lái)中轉(zhuǎn)。
- 路由器接收到 qq.com 的頁(yè)面后,把頁(yè)面發(fā)送給你的電腦或手機(jī)。路由器知道如何給這些信息指路,路由器就是一個(gè)指路人,這就是「路由」兩個(gè)字的來(lái)歷。
- 路,就是「必由之路」中的路。由,就是「必由之路」中的由(由是經(jīng)過(guò)、緣由的意思)。所有的信息都要經(jīng)過(guò)路由器,然后被指向一條它該去的路。
- 也就是說(shuō)內(nèi)網(wǎng)和外網(wǎng)就像兩個(gè)隔絕的空間,無(wú)法互通,唯一的聯(lián)通點(diǎn)就是路由器(因?yàn)槁酚善骷扔型饩W(wǎng) IP 也有內(nèi)網(wǎng) IP),所以路由器有時(shí)候也被叫做「網(wǎng)關(guān)」,這個(gè)「關(guān)」是「一夫當(dāng)關(guān),萬(wàn)夫莫開(kāi)」的「關(guān)」。如果路由器到電信的連接中斷了,那么內(nèi)網(wǎng)中所有的設(shè)備也就無(wú)法上網(wǎng)了。(這很好理解,相當(dāng)于唯一一條出去的路斷了)
- 除了內(nèi)網(wǎng) IP 和外網(wǎng) IP,還有兩個(gè)特別特殊的 IP,就是本地 IP:127.0.0.1。本地 IP 永遠(yuǎn)表示設(shè)備自己。不信你可以 ping 127.0.0.1 一下,會(huì)發(fā)現(xiàn)只需要 0.01 ms 就得到了響應(yīng)(你 ping qq.com 需要幾十毫秒才得到響應(yīng))
- 默認(rèn)情況下,hosts 文件里會(huì)有一行
127.0.0.1 localhost,意思就是 localhost 指向 127.0.0.1,所以 localhost 也表示設(shè)備自己。不信你 ping localhost 試試,會(huì)發(fā)現(xiàn)實(shí)際上是在 ping 127.0.0.1
- 默認(rèn)情況下,hosts 文件里會(huì)有一行
- 還有一個(gè)特別特殊的 IP:0.0.0.0,它不表示任何設(shè)備。這個(gè) IP 不同的地方含義不同,以后我們會(huì)用到,用到的時(shí)候再說(shuō)意思。
端口
你想要訪(fǎng)問(wèn)一個(gè)設(shè)備(前提是你使用的是 TCP 或 UDP 協(xié)議。還記得嗎,HTTP 就使用了 TCP),只指定 IP 是不夠的,還必須指定端口(Port)。
端口其實(shí)就是一個(gè)編號(hào),并不是一種硬件。
一個(gè)服務(wù)器(硬件)不一定只提供一種服務(wù),比如一個(gè)服務(wù)器既提供 HTTP 服務(wù),又提供 FTP 服務(wù),還提供 SMTP 服務(wù)(郵件服務(wù)),那么只用一個(gè) IP 是無(wú)法告訴服務(wù)器你想要使用哪種服務(wù)。
所以這里有一個(gè)重要的原則:一個(gè)端口對(duì)應(yīng)一個(gè)服務(wù)。
比如
- 要提供 HTTP 服務(wù)你最好使用 80 端口(能不能使用別的端口?可以,不過(guò)不建議你違反約定)
- 要提供 HTTPS 服務(wù)你最好使用 443 端口(能不能使用別的端口?可以,不過(guò)不建議你違反約定)
- 要提供 FTP 服務(wù)你最好使用 21 端口(能不能使用別的端口?可以,不過(guò)不建議你違反約定)
問(wèn)題1:我怎么知道應(yīng)該使用什么端口?
維基百科 把 0 到 1023 號(hào)端口對(duì)應(yīng)的服務(wù)都告訴你了,點(diǎn)進(jìn)去看看吧。
問(wèn)題2:一共由多少端口?
每個(gè)機(jī)器一共有 65535(2的16次方減1)個(gè)端口(這是協(xié)議規(guī)定的)。不過(guò)這些端口的使用由一些規(guī)定
- 0 到 1023(2的10次方減1)號(hào)端口是留給系統(tǒng)使用的,你只有擁有了管理員權(quán)限后,才能使用這 1024 個(gè)端口。
- 其他端口可以給普通用戶(hù)使用
- 如果一個(gè)端口正在提供服務(wù),也就是被占用了,那么就不能再使用這個(gè)端口。除非你先停掉正在占用這個(gè)端口的服務(wù)。以后你們會(huì)經(jīng)常遇到這個(gè)問(wèn)題。
總結(jié)
上面都是 TCP/IP 相關(guān)的知識(shí),如果你記不住,就記住下面這句話(huà):
使用 HTTP 協(xié)議訪(fǎng)問(wèn)另一個(gè) IP 時(shí),必須同時(shí)提供 IP 和端口號(hào),缺一不可。
那么問(wèn)題來(lái)了
我訪(fǎng)問(wèn) http://qq.com 時(shí)并沒(méi)有提供端口號(hào),為什么我依然可以訪(fǎng)問(wèn)
答:因?yàn)?strong>瀏覽器幫你加了默認(rèn)端口號(hào) 80。