阿里大佬終于把TCP/IP 協(xié)議學(xué)習(xí)筆記整理出來(lái)了
一般來(lái)說(shuō),TCP/IP 是利用IP進(jìn)行通信時(shí)所必須用到的協(xié)議群的統(tǒng)稱。具體點(diǎn),IP或ICMP、TCP或UDP、TELENT或ETP、以及HTTP等都屬于TCP/IP協(xié)議,而TCP/IP泛指這些協(xié)議。
TCP/IP協(xié)議分層模型
網(wǎng)絡(luò)協(xié)議通常分為不同層次進(jìn)行開(kāi)發(fā),每一層分別負(fù)責(zé)不同的通信功能。一個(gè)協(xié)議族,比如TCP/IP,是一組不同層次上的多個(gè)協(xié)議的組合。TCP/IP通常被認(rèn)為是一個(gè)四層協(xié)議系統(tǒng),如下表所示:
通常情況下,應(yīng)用程序就是一個(gè)用戶進(jìn)程,而下三層則一般在(操作系統(tǒng))內(nèi)核中執(zhí)行,例如 UNIX 操作系統(tǒng)。除此之外,應(yīng)用層與下三層還有一個(gè)關(guān)鍵不同在于:應(yīng)用層關(guān)心的是應(yīng)用程序的細(xì)節(jié),而不是數(shù)據(jù)在網(wǎng)絡(luò)中的傳輸活動(dòng),下三層對(duì)應(yīng)用程序一無(wú)所知,但它們要處理所有的通信細(xì)節(jié)。
在TCP/IP協(xié)議族中,網(wǎng)絡(luò)層IP提供的是一種不可靠的服務(wù),也就是說(shuō),它只是盡快的將分組從源結(jié)點(diǎn)送到目的結(jié)點(diǎn),但并不提供任何可靠性保證。而另一方面,TCP在不可靠的IP層上提供了一個(gè)可靠的運(yùn)輸層。為了提供這種可靠的服務(wù),TCP采用了超時(shí)重傳、發(fā)送和接收端到端的確認(rèn)分組等機(jī)制。由此可見(jiàn),運(yùn)輸層和網(wǎng)絡(luò)層分別負(fù)責(zé)不同的功能。
TCP/IP 的分層
在 TCP/IP 協(xié)議族中,有很多中協(xié)議。如下圖所示:
TCP 和 UDP 是兩種最為著名的運(yùn)輸協(xié)議,二者都可以使用 IP 作為網(wǎng)絡(luò)層協(xié)議。雖然 TCP 使用不可靠的 IP 服務(wù),但它卻提供了一種可靠的運(yùn)輸層服務(wù);UDP 為應(yīng)用程序發(fā)送和接收數(shù)據(jù)包。一個(gè)數(shù)據(jù)報(bào)是指從發(fā)送方傳輸?shù)浇邮辗降囊粋€(gè)信息單元。但是與 TCP 不同的是,UDP 是不可靠的的,它不能保證數(shù)據(jù)保證能夠安全無(wú)誤地到達(dá)最終目的。
IP 是網(wǎng)絡(luò)層上的主要協(xié)議,同時(shí)被 TCP 和 UDP 使用。TCP 和 UDP 的每組數(shù)據(jù)都通過(guò)端系統(tǒng)和每個(gè)中間路由器中的IP層在互聯(lián)網(wǎng)中進(jìn)行傳輸。ICMP是IP協(xié)議的附屬協(xié)議,IP層用它來(lái)與其他主機(jī)或路由器交換錯(cuò)誤報(bào)文和其他重要信息。Ping 和 Traceroute,它們都使用了 ICMP。IGMP 是 Internet 組織管理協(xié)議,它用來(lái)把一個(gè) UDP 數(shù)據(jù)報(bào)多播到多個(gè)主機(jī)。
ARP(地址解析協(xié)議)和 RARP(逆地址解析協(xié)議)是某些網(wǎng)絡(luò)接口使用的特殊協(xié)議,用來(lái)轉(zhuǎn)換IP層和網(wǎng)絡(luò)接口層使用的地址。
當(dāng)應(yīng)用程序用TCP傳送數(shù)據(jù)時(shí),數(shù)據(jù)被送入?yún)f(xié)議棧中,然后逐個(gè)通過(guò)每一層直到被當(dāng)作一串比特流送入網(wǎng)絡(luò),其中每一層對(duì)收到的數(shù)據(jù)都要增加一些首部信息(有時(shí)還要加一些尾部信息)。TCP 傳給IP的數(shù)據(jù)單元稱作TCP報(bào)文段或簡(jiǎn)稱為 TCP 段。IP傳給網(wǎng)絡(luò)接口層的數(shù)據(jù)單元稱作IP數(shù)據(jù)報(bào)。通過(guò)以太網(wǎng)傳輸?shù)谋忍亓鞣Q為幀。 UDP 數(shù)據(jù)與 TCP 數(shù)據(jù)基本一致。唯一不同的是 UDP 傳給IP的信息單元稱為 UDP 數(shù)據(jù)報(bào),而且 UDP 的首部長(zhǎng)為8字節(jié)。
IP:網(wǎng)際協(xié)議
IP 是TCP/IP協(xié)議族中最為核心的協(xié)議。所有的TCP、UDP、ICMP及IGMP數(shù)據(jù)都以IP數(shù)據(jù)報(bào)格式傳輸,它提供不可靠、無(wú)連接的數(shù)據(jù)報(bào)傳送服務(wù)。
不可靠的意思是指它不能保證IP數(shù)據(jù)報(bào)能夠成功地到達(dá)目的地。IP僅提供最基本的傳輸服務(wù)。如果發(fā)生某種錯(cuò)誤時(shí),如某個(gè)路由器暫時(shí)用完了緩沖區(qū),IP有一個(gè)簡(jiǎn)單的錯(cuò)誤處理算法:丟棄該數(shù)據(jù)報(bào),然后發(fā)送ICMP消息報(bào)給信源端。
無(wú)連接是指IP并不維護(hù)任何關(guān)于后續(xù)數(shù)據(jù)報(bào)的狀態(tài)信息。每個(gè)數(shù)據(jù)報(bào)表的處理是相互獨(dú)立的。這也說(shuō)明,IP數(shù)據(jù)報(bào)可以不按發(fā)送順序接收。
IP首部
IP 數(shù)據(jù)報(bào)的格式,如圖所示:
版本號(hào):版本號(hào)字段占4位: IP協(xié)議的版本號(hào),一般有兩個(gè)值,如果為4就代表是IPv4,6就代表是IPv6協(xié)議。 4→IPv4, 6 → IPv6
首部長(zhǎng)度:指首部占32位字的數(shù)目。普通IP數(shù)據(jù)報(bào)(沒(méi)有任何選擇項(xiàng))字段的值是5。
服務(wù)類型(TOS)字段:包括一個(gè)3bit的優(yōu)先權(quán)子字段,4bit的TOS子字段和1bit未用位但必須置0。4 bit的TOS分別代表:最小時(shí)延、最大吞吐量、最高可靠性和最小費(fèi)用。4bit中只能置其中1bit。
總長(zhǎng)度字段:指整個(gè)IP數(shù)據(jù)報(bào)的長(zhǎng)度,以字節(jié)為單位。利用首部長(zhǎng)度字段和總長(zhǎng)度字段就可以知道IP數(shù)據(jù)報(bào)中數(shù)據(jù)內(nèi)容的起始位置和長(zhǎng)度??傞L(zhǎng)度字段是IP首部中必要的內(nèi)容。
標(biāo)識(shí)字段:唯一的標(biāo)識(shí)就是主機(jī)發(fā)送的每一份數(shù)據(jù)報(bào)。通常每發(fā)送一份報(bào)文它的值就加1。
TTL:生存時(shí)間字段設(shè)置了數(shù)據(jù)報(bào)可以經(jīng)過(guò)的最多路由器數(shù)。
首部檢驗(yàn)和字段:根據(jù)IP首部計(jì)算的檢驗(yàn)和碼。它不對(duì)首部后面的數(shù)據(jù)進(jìn)行計(jì)算。ICMP、IGMP、UDP、TCP在它們各自的首部中均含有同時(shí)覆蓋首部和數(shù)據(jù)檢驗(yàn)和碼。
如何計(jì)算一份數(shù)據(jù)報(bào)的IP檢驗(yàn)和:1.檢驗(yàn)和字段置為0; 2.對(duì)首部的每個(gè)16bit進(jìn)行二進(jìn)制反碼求和并存入檢驗(yàn)和字段中。 3. 接收方對(duì)收到的IP首部劃分為若干個(gè)16bit,并進(jìn)行反碼求和,如果接收方計(jì)算結(jié)果全為1,則無(wú)錯(cuò)。
IP路由選擇
主機(jī)的路由選擇可以非常簡(jiǎn)單:如果目的主機(jī)在直接連接的網(wǎng)絡(luò)上,那么就把數(shù)據(jù)報(bào)直接傳給目的主機(jī),否則傳給默認(rèn)路由器。
在進(jìn)行路由選擇決策時(shí),主機(jī)和路由器都使用路由表。在表中,有三種類型的路由:特定主機(jī)型、特定網(wǎng)絡(luò)型和默認(rèn)路由型。路由表在表目具有一定的優(yōu)先級(jí)。在選擇路由時(shí),主機(jī)路由優(yōu)先于網(wǎng)絡(luò)路由,最后在沒(méi)有其他可選路由存在時(shí)才選擇默認(rèn)路由。
IP路由選擇是通過(guò)逐跳來(lái)實(shí)現(xiàn)的。數(shù)據(jù)報(bào)在各站的傳輸過(guò)程中目的IP地址始終不變,但是封裝和目的鏈路層地址在每一站都可以改變。
運(yùn)輸層協(xié)議:TCP 和 UDP
運(yùn)輸層介于應(yīng)用層和網(wǎng)絡(luò)層之間,將主機(jī)到主機(jī)的端對(duì)端通信能力擴(kuò)展為進(jìn)程到進(jìn)程的端到端通信能力。它運(yùn)行在位于英特網(wǎng)邊緣的端系統(tǒng)上,對(duì)上直接為不同的應(yīng)用程序進(jìn)程提供可靠的或盡力而為的通信服務(wù),對(duì)下則有效地利用網(wǎng)絡(luò)層的IP盡力而為服務(wù)。運(yùn)輸層是TCP/IP 分層網(wǎng)絡(luò)體系結(jié)構(gòu)中承上啟下的重要環(huán)節(jié)。
多路復(fù)用與多路分解
網(wǎng)絡(luò)層的傳輸通道只有一個(gè),但是應(yīng)用進(jìn)程之間的交互關(guān)系卻很多,因此運(yùn)輸層擔(dān)負(fù)著將多個(gè)應(yīng)用進(jìn)程的報(bào)文通過(guò)同一個(gè)網(wǎng)絡(luò)層傳遞通道進(jìn)行傳輸,并正確地交給某個(gè)應(yīng)用進(jìn)程的任務(wù),稱為運(yùn)輸層的多路復(fù)用與多路分解。
套接字和端口
端口和套接字的作用:為了表示主機(jī)中存在多個(gè)進(jìn)程,我們用端口號(hào)標(biāo)識(shí)這臺(tái)主機(jī)中的進(jìn)程,用IP地址標(biāo)識(shí)這臺(tái)主機(jī);端口連同標(biāo)識(shí)主機(jī)接口的IP地址一起,能夠唯一標(biāo)識(shí)網(wǎng)絡(luò)中的任何進(jìn)程(TCP 和 UDP 的端口號(hào)各自獨(dú)立);為了簡(jiǎn)化編程操作,我們引入套接字(Socket)來(lái)描述網(wǎng)絡(luò)兩端進(jìn)程之間的通信鏈(通信鏈表示通信雙方IP地址、端口號(hào)及運(yùn)輸層協(xié)議之間的關(guān)聯(lián))。
當(dāng)接收主機(jī)收到一個(gè)數(shù)據(jù)報(bào)時(shí),其運(yùn)輸層并沒(méi)有直接將數(shù)據(jù)報(bào)交給應(yīng)用進(jìn)程,而是將其交給了一個(gè)套接字進(jìn)行處理,并由其轉(zhuǎn)交給相應(yīng)的應(yīng)用進(jìn)程。
多路復(fù)用要求:套接字有唯一的標(biāo)識(shí),該標(biāo)識(shí)的具體格式與它是UDP還是TCP類型有關(guān);每個(gè)報(bào)文段都有特殊字段來(lái)指示該報(bào)文段要交付到的端口號(hào)
UDP 套接字用一個(gè)二元組(目的IP地址、目標(biāo)端口號(hào))來(lái)標(biāo)識(shí)的,TCP套接字是用四元組(源IP地址、源端口號(hào)、目的IP地址、目的端口號(hào))來(lái)標(biāo)識(shí)的。
UDP :用戶數(shù)據(jù)報(bào)協(xié)議
UDP 是一個(gè)簡(jiǎn)單的面向數(shù)據(jù)報(bào)的運(yùn)輸層協(xié)議:進(jìn)程中每個(gè)輸出操作都正好產(chǎn)生一個(gè)UDP數(shù)據(jù)報(bào),并組裝成一份代發(fā)送的 IP 數(shù)據(jù)報(bào)。它只是在 IP 的基礎(chǔ)上擴(kuò)展了多路復(fù)用/分解功能。
UDP 具有以下特點(diǎn):
- 除了多路復(fù)用/分解及某種輕型的差錯(cuò)檢測(cè)功能外,應(yīng)用程序幾乎都是直接與IP打交道。
- UDP稱為無(wú)連接的,使用UDP時(shí),在發(fā)送報(bào)文段之前,發(fā)送方和接收方的運(yùn)輸層實(shí)體之間沒(méi)有握手過(guò)程,因此UDP具有較小的協(xié)議開(kāi)銷和發(fā)送數(shù)據(jù)之前的時(shí)延
- UDP不保證可靠交付,它繼承了IP的盡力而為交付的特性
- UDP 沒(méi)有流量控制和擁塞控制
- UDP 是面向報(bào)文的。應(yīng)用程序交給UDP一個(gè)報(bào)文段,UDP就發(fā)送該報(bào)文段,不會(huì)將應(yīng)用程序交來(lái)的報(bào)文段劃分為若干個(gè)分組來(lái)發(fā)送,也不會(huì)將收到的若干個(gè)報(bào)文合并后再交付給應(yīng)用程序。
- UDP具有較高的協(xié)議效率。其首部開(kāi)銷只有8字節(jié),而TCP的首部為20個(gè)字節(jié)。
UDP 報(bào)文段的首部格式:
從圖中可以看到,UDP 數(shù)據(jù)報(bào)是由UDP首部和放置在UDP報(bào)文段的的數(shù)據(jù)字段的應(yīng)用層數(shù)據(jù)組成。
UDP計(jì)算檢驗(yàn)和的方法和計(jì)算IP數(shù)據(jù)報(bào)首部檢驗(yàn)和的方式相似,不同之處在于IP數(shù)據(jù)報(bào)的檢驗(yàn)和只檢驗(yàn)IP數(shù)據(jù)報(bào)的首部,但UDP的檢驗(yàn)和是把UDP報(bào)文段和偽首部放在一起檢驗(yàn),以防止將報(bào)文段意外的交付到錯(cuò)誤的目的地。
TCP:傳輸控制協(xié)議
TCP 能夠提供面向連接、可靠數(shù)據(jù)傳輸和擁塞控制等服務(wù)。
TCP 的主要特點(diǎn)可以歸納為以下幾點(diǎn):
- TCP 是面向連接的端到端協(xié)議,發(fā)送方再向接收方發(fā)送數(shù)據(jù)之前,必須通過(guò)“三次握手”。TCP連接的狀態(tài)僅保留在兩個(gè)端系統(tǒng)中,與中間路由和鏈路層交換機(jī)無(wú)關(guān)。
- TCP 連接是點(diǎn)到點(diǎn)的。也就是說(shuō)TCP連接是在單個(gè)發(fā)送方與單個(gè)接收方之間的連接。
- TCP 連接提供全雙工服務(wù)。
- TCP 提供可靠的交付服務(wù),也就是說(shuō)通過(guò)TCP連接傳輸?shù)臄?shù)據(jù),能夠保證無(wú)差錯(cuò)、不丟失、不重復(fù)并且按序的到達(dá)。
- TCP采用客戶/服務(wù)器模式。
- TCP報(bào)文段的劃分。當(dāng)建立起一條TCP連接,兩個(gè)應(yīng)用進(jìn)程就可以互相發(fā)送數(shù)據(jù)了,數(shù)據(jù)流通過(guò)套接字傳輸。
- TCP 面向字節(jié)流。TCP中的“流”是指流入到進(jìn)程或從進(jìn)程流出的字節(jié)序列。
- 除此之外,TCP還有著名的流量控制與擁塞控制。