TCP/IP 網(wǎng)絡(luò)模型有哪幾層?

在傳輸層會(huì)有兩個(gè)傳輸協(xié)議,分別是 TCP 和 UDP。
TCP 的全稱(chēng)叫傳輸控制協(xié)議(Transmission Control Protocol),大部分應(yīng)用使用的正是 TCP 傳輸層協(xié)議,比如 HTTP 應(yīng)用層協(xié)議。TCP 相比 UDP 多了很多特性,比如流量控制、超時(shí)重傳、擁塞控制等,這些都是為了保證數(shù)據(jù)包能可靠地傳輸給對(duì)方。
UDP 相對(duì)來(lái)說(shuō)就很簡(jiǎn)單,簡(jiǎn)單到只負(fù)責(zé)發(fā)送數(shù)據(jù)包,不保證數(shù)據(jù)包是否能抵達(dá)對(duì)方,但它實(shí)時(shí)性相對(duì)更好,傳輸效率也高。當(dāng)然,UDP 也可以實(shí)現(xiàn)可靠傳輸,把 TCP 的特性在應(yīng)用層上實(shí)現(xiàn)就可以,不過(guò)要實(shí)現(xiàn)一個(gè)商用的可靠 UDP 傳輸協(xié)議,也不是一件簡(jiǎn)單的事情。
應(yīng)用需要傳輸?shù)臄?shù)據(jù)可能會(huì)非常大,如果直接傳輸就不好控制,因此當(dāng)傳輸層的數(shù)據(jù)包大小超過(guò) MSS(TCP 最大報(bào)文段長(zhǎng)度) ,就要將數(shù)據(jù)包分塊,這樣即使中途有一個(gè)分塊丟失或損壞了,只需要重新發(fā)送這一個(gè)分塊,而不用重新發(fā)送整個(gè)數(shù)據(jù)包。在 TCP 協(xié)議中,我們把每個(gè)分塊稱(chēng)為一個(gè)?TCP 段(TCP Segment)。

當(dāng)設(shè)備作為接收方時(shí),傳輸層則要負(fù)責(zé)把數(shù)據(jù)包傳給應(yīng)用,但是一臺(tái)設(shè)備上可能會(huì)有很多應(yīng)用在接收或者傳輸數(shù)據(jù),因此需要用一個(gè)編號(hào)將應(yīng)用區(qū)分開(kāi)來(lái),這個(gè)編號(hào)就是端口。
比如 80 端口通常是 Web 服務(wù)器用的,22 端口通常是遠(yuǎn)程登錄服務(wù)器用的。而對(duì)于瀏覽器(客戶(hù)端)中的每個(gè)標(biāo)簽欄都是一個(gè)獨(dú)立的進(jìn)程,操作系統(tǒng)會(huì)為這些進(jìn)程分配臨時(shí)的端口號(hào)。
由于傳輸層的報(bào)文中會(huì)攜帶端口號(hào),因此接收方可以識(shí)別出該報(bào)文是發(fā)送給哪個(gè)應(yīng)用。

網(wǎng)絡(luò)層最常使用的是 IP 協(xié)議(Internet Protocol),IP 協(xié)議會(huì)將傳輸層的報(bào)文作為數(shù)據(jù)部分,再加上 IP 包頭組裝成 IP 報(bào)文,如果 IP 報(bào)文大小超過(guò) MTU(以太網(wǎng)中一般為 1500 字節(jié))就會(huì)再次進(jìn)行分片,得到一個(gè)即將發(fā)送到網(wǎng)絡(luò)的 IP 報(bào)文。

網(wǎng)絡(luò)層負(fù)責(zé)將數(shù)據(jù)從一個(gè)設(shè)備傳輸?shù)搅硪粋€(gè)設(shè)備,世界上那么多設(shè)備,又該如何找到對(duì)方呢?因此,網(wǎng)絡(luò)層需要有區(qū)分設(shè)備的編號(hào)。
我們一般用 IP 地址給設(shè)備進(jìn)行編號(hào),對(duì)于 IPv4 協(xié)議, IP 地址共 32 位,分成了四段(比如,192.168.100.1),每段是 8 位。只有一個(gè)單純的 IP 地址雖然做到了區(qū)分設(shè)備,但是尋址起來(lái)就特別麻煩,全世界那么多臺(tái)設(shè)備,難道一個(gè)一個(gè)去匹配?這顯然不科學(xué)。
因此,需要將 IP 地址分成兩種意義:
一個(gè)是網(wǎng)絡(luò)號(hào),負(fù)責(zé)標(biāo)識(shí)該 IP 地址是屬于哪個(gè)「子網(wǎng)」的;
一個(gè)是主機(jī)號(hào),負(fù)責(zé)標(biāo)識(shí)同一「子網(wǎng)」下的不同主機(jī);
怎么分的呢?這需要配合子網(wǎng)掩碼才能算出 IP 地址 的網(wǎng)絡(luò)號(hào)和主機(jī)號(hào)。
舉個(gè)例子,比如 10.100.122.0/24,后面的/24
表示就是?255.255.255.0
?子網(wǎng)掩碼,255.255.255.0 二進(jìn)制是「11111111-11111111-11111111-00000000」,大家數(shù)數(shù)一共多少個(gè)1?不用數(shù)了,是 24 個(gè)1,為了簡(jiǎn)化子網(wǎng)掩碼的表示,用/24代替255.255.255.0。
知道了子網(wǎng)掩碼,該怎么計(jì)算出網(wǎng)絡(luò)地址和主機(jī)地址呢?
將 10.100.122.2 和 255.255.255.0 進(jìn)行按位與運(yùn)算,就可以得到網(wǎng)絡(luò)號(hào),如下圖:




