成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

通俗易懂講解什么是TCP/IP

2021-03-06    分類: 網(wǎng)站建設(shè)

近期工作,跟網(wǎng)絡(luò)協(xié)議相關(guān),這讓我有機(jī)會(huì)更深入學(xué)習(xí)網(wǎng)絡(luò)協(xié)議,而之前很長(zhǎng)一段時(shí)間,我對(duì)網(wǎng)絡(luò)協(xié)議的理解都停留在比較淺的層面。

比如:TCP是面向連接的、可靠傳輸,而UDP是非連接的、不可靠傳輸,TCP建連需要3次握手,會(huì)造成delay,UDP更快。

比如:socket編程,服務(wù)器socket create、bind、listen、accept、read/write、shutdown/close,客戶端socket create、connect、read/write、shutdown/close,再加上epoll/select這幾下子。

再比如:我知道網(wǎng)絡(luò)編程要忽視SIGPIPE信號(hào)不然會(huì)掛,read返回0代表對(duì)端主動(dòng)關(guān)閉,非阻塞的read要放在循環(huán)里要考慮返回值,多路復(fù)用以及阻塞、非阻塞的區(qū)別。

TCP/UDP的區(qū)別上,我是這樣理解的:從北京到杭州,TCP相當(dāng)于修了一條高鐵線路(建連)再通車發(fā)貨(傳輸數(shù)據(jù)),而UDP相當(dāng)于寄快遞,丟了不管(直接傳輸數(shù)據(jù))。

上面的理解對(duì)不對(duì)?可以說(shuō)對(duì),也可以說(shuō)不對(duì)。對(duì)于應(yīng)用程序員來(lái)說(shuō),有了上面的認(rèn)識(shí)+熟悉socket編程接口,夠了嗎?不夠嗎?

大物理學(xué)家費(fèi)曼提出一個(gè)高效的費(fèi)曼學(xué)習(xí)法,即從問(wèn)題入手,試著把問(wèn)題都講出來(lái),以教代學(xué),一旦你能把問(wèn)題都講清楚,便學(xué)會(huì)了。所以我想嘗試一下把TCP/IP講清楚,借此讓自己學(xué)明白,順便幫助一下讀者。

雖然《TCP/IP詳解卷1》是一本關(guān)于互聯(lián)網(wǎng)協(xié)議族很嚴(yán)謹(jǐn)詳盡的書(shū),但在我看來(lái),它稍微有點(diǎn)晦澀,可能需要讀幾遍,才能心領(lǐng)神會(huì)。雖然我沒(méi)有能力把這個(gè)問(wèn)題說(shuō)的更好,但因?yàn)槲医?jīng)歷過(guò)從稀里糊涂到稍有所悟的過(guò)程,這可能是大師不可比的,我將盡量用通俗易懂的語(yǔ)言把TCP/IP相關(guān)的知識(shí)講清楚。

互聯(lián)網(wǎng)協(xié)議族,用來(lái)實(shí)現(xiàn)互聯(lián)網(wǎng)上

主機(jī)

之間的相互通信。TCP和IP只是其中的2個(gè)協(xié)議,也是很重要的2個(gè)協(xié)議,所以用TCP/IP來(lái)命名這個(gè)互聯(lián)網(wǎng)協(xié)議族,實(shí)際上,它還包括其他協(xié)議,比如UDP、ICMP、IGMP、ARP/RARP等。

四層劃分,兩種劃分的對(duì)照?qǐng)D讓彼此關(guān)系一目了然。



分層是計(jì)算機(jī)領(lǐng)域的常用技巧,比如互聯(lián)網(wǎng)后端的三層架構(gòu)“接入-邏輯-存儲(chǔ)”就是分層思想的典型應(yīng)用。

分層是為了隔離,通過(guò)分層劃分職能,拆解問(wèn)題,層與層之間約定接口,屏蔽實(shí)現(xiàn)細(xì)節(jié)。

TCP/IP自下到上劃分為鏈路層、網(wǎng)絡(luò)層、傳輸層、應(yīng)用層。下層向上層提供能力,上層利用下層的能力提供更高的抽象。

1. 鏈路層,也稱網(wǎng)絡(luò)接口層,包括操作系統(tǒng)的設(shè)備驅(qū)動(dòng)程序和網(wǎng)卡,它們一起處理與傳輸媒介(光纖等)的物理接口細(xì)節(jié)。

2. 網(wǎng)絡(luò)層,也就是IP層,負(fù)責(zé)處理IP datagram在網(wǎng)絡(luò)中的傳輸,IP層傳輸?shù)氖荌P datagram,借助路由表,把IP datagram從網(wǎng)絡(luò)的一端傳輸?shù)搅硪欢?,?jiǎn)而言之:IP實(shí)現(xiàn)包的路由傳輸,IP協(xié)議和路由器工作在網(wǎng)絡(luò)層。

3. 傳輸層,提供端到端之間的通信,包括提供面向連接和高可靠性的TCP,以及無(wú)連接不可靠的UDP。貌似TCP更好,但實(shí)際不是這樣,UDP因?yàn)椴恍枰ㄟB開(kāi)銷,所以更快,應(yīng)用得也很廣,比如新一代互聯(lián)網(wǎng)協(xié)議HTTP3就從TCP轉(zhuǎn)向UDP,應(yīng)根據(jù)適應(yīng)場(chǎng)景選擇傳輸層協(xié)議。

4. 應(yīng)用層,跟應(yīng)用相關(guān),不同應(yīng)用解決不同問(wèn)題,需要不同的應(yīng)用層協(xié)議。



鏈路層處理數(shù)據(jù)在媒介上的傳輸,以及主機(jī)與網(wǎng)卡、光纖等打交道的細(xì)節(jié)。因?yàn)榕c硬件相關(guān),所以需要借助系統(tǒng)的驅(qū)動(dòng)程序,鏈路層協(xié)議就是定義這些細(xì)節(jié)的,比如怎么把數(shù)據(jù)從網(wǎng)卡發(fā)送到光纖,采用什么格式編碼等,它解決的數(shù)據(jù)在媒介上表示、流動(dòng)的問(wèn)題。

光有鏈路層功能肯定是不夠的,網(wǎng)絡(luò)上有成千上萬(wàn)的機(jī)器,主機(jī)A與B通信,你不能將數(shù)據(jù)發(fā)到主機(jī)C,所以仿照現(xiàn)實(shí),要為主機(jī)分配網(wǎng)絡(luò)地址,通過(guò)IP地址去標(biāo)識(shí)網(wǎng)絡(luò)中的一臺(tái)主機(jī),發(fā)送一個(gè)數(shù)據(jù)包,需要正確路由到目的地,這就好比你從家到公司,要經(jīng)過(guò)哪些路徑,需要地圖,而路由表就類似這張地圖。IP解決的是數(shù)據(jù)包在網(wǎng)絡(luò)中的傳輸路由的問(wèn)題。

有了網(wǎng)絡(luò)層的傳輸路由能力,還不夠,因?yàn)镮P報(bào)在傳輸過(guò)程中可能丟包,比如中間經(jīng)歷過(guò)的路由器緩沖區(qū)滿了便會(huì)丟包,這樣不可靠,如果需要可靠傳輸?shù)哪芰?,便需要傳輸層基于IP層,提供更多的能力,TCP解決了可靠性問(wèn)題。具體而言,如果丟包了,TCP層會(huì)負(fù)責(zé)超時(shí)重傳,它通過(guò)接收確認(rèn)和重傳機(jī)制保證了可靠傳輸。另外,因?yàn)镮P報(bào)都是獨(dú)立路由的,所以從主機(jī)A到主機(jī)B,一份數(shù)據(jù)被拆分成x、y兩個(gè)IP報(bào)先后發(fā)送,這2個(gè)包可能選擇不同的傳輸路徑,這樣有可能y包先于x包到達(dá),但我們希望在接收端(主機(jī)B)恢復(fù)這個(gè)數(shù)據(jù)的信息,但我們無(wú)法控制IP報(bào)的到達(dá)順序,所以,我們需要在接收端恢復(fù)數(shù)據(jù),我只需要在x、y包里記錄它屬于數(shù)據(jù)塊的哪個(gè)部分,然后重組這份數(shù)據(jù),這正是TCP做的,它會(huì)重新組裝IP報(bào),從而保證順序性,遞交給應(yīng)用層。

有時(shí)候并不需要保證可靠性和順序性,這便是UDP能提供的,它只是簡(jiǎn)單的把數(shù)據(jù)封裝成IP報(bào),然后通過(guò)IP層路由發(fā)送到目的端。

再往上,便是應(yīng)用層協(xié)議了,比如http,又比如游戲服務(wù)器自定義協(xié)議,應(yīng)用層協(xié)議通常基于TCP或者UDP做傳輸。

協(xié)議?懶得去翻協(xié)議的各種權(quán)威定義了,我認(rèn)為協(xié)議就是約定,跟現(xiàn)實(shí)生活中協(xié)議這個(gè)詞含義差不多。網(wǎng)絡(luò)協(xié)議就是通信雙方共同遵守的約定,更具體一點(diǎn),就是定義數(shù)據(jù)在網(wǎng)絡(luò)上傳輸?shù)母袷?、?guī)則和流程。

因?yàn)榫W(wǎng)絡(luò)是分層模型,不同層有不同層的作用,所以為各層定義各層的規(guī)則,各層對(duì)應(yīng)的各層協(xié)議。

前面講了TCP/IP協(xié)議族包含很多協(xié)議,這些協(xié)議分屬不同的分層,承擔(dān)不同的作用。



  1. TCP和UDP是兩種主要的傳輸層協(xié)議。
  2. IP是網(wǎng)絡(luò)層的主要協(xié)議,TCP、UDP都需要利用IP協(xié)議進(jìn)行數(shù)據(jù)傳輸。
  3. ICMP是互聯(lián)網(wǎng)控制報(bào)文協(xié)議,是IP的附屬協(xié)議,IP層用它來(lái)與其他主機(jī)或路由器交換錯(cuò)誤報(bào)文和其他重要信息。比如一個(gè)Packet經(jīng)過(guò)某個(gè)路由器節(jié)點(diǎn)的時(shí)候,超過(guò)網(wǎng)絡(luò)對(duì)Packet的長(zhǎng)度限制,而又不分片,則會(huì)給發(fā)送端發(fā)送一個(gè)ICMP包報(bào)告錯(cuò)誤信息,屬于ICMP是用來(lái)輔助IP完成數(shù)據(jù)包傳輸?shù)摹?/li>
  4. IGMP是Internet組管理協(xié)議,用來(lái)把一個(gè)包多播到多個(gè)主機(jī)
  5. ARP(地址解析協(xié)議)和RARP(逆地址解析協(xié)議)是用來(lái)轉(zhuǎn)換IP層和鏈路層的地址,IP層使用IP地址,鏈路層使用Mac地址

應(yīng)用層和傳輸層使用端到端(end-to-end)協(xié)議,網(wǎng)絡(luò)層提供的是逐跳(hop-by-hop)協(xié)議。

層層封裝的,從應(yīng)用層到鏈路層,每經(jīng)過(guò)一層都要添加一些額外信息(首、尾部)。



  1. 用戶數(shù)據(jù)經(jīng)過(guò)應(yīng)用程序加上應(yīng)用程序首部,轉(zhuǎn)給TCP層處理
  2. 經(jīng)過(guò)TCP層加上TCP首部,產(chǎn)生TCP段(segment)
  3. TCP segment經(jīng)過(guò)IP層再加上IP首部,產(chǎn)生IP數(shù)據(jù)包(datagram)
  4. IP datagram通過(guò)鏈路層,經(jīng)以太網(wǎng)驅(qū)動(dòng)程序處理后,加上以太網(wǎng)首部+尾部,產(chǎn)生以太網(wǎng)幀(frame),以太網(wǎng)幀的長(zhǎng)度在46~1500之間

更準(zhǔn)確的說(shuō),在IP和鏈路層傳輸?shù)臄?shù)據(jù)單元叫分組(Packet),分組既可以是一個(gè)IP datagram也可以是IP datagram的一個(gè)分片(fragment)。

UDP的封裝跟TCP略有不同,主要體現(xiàn)在經(jīng)過(guò)傳輸層(UDP)之后添加的是8字節(jié)UDP首部,產(chǎn)生UDP datagram。

封裝過(guò)程中,經(jīng)過(guò)TCP/UDP層的時(shí)候,會(huì)把端口號(hào)添加到TCP/UDP首部;經(jīng)過(guò)IP層的時(shí)候,會(huì)把協(xié)議類型(TCP or UDP or ICMP or IGMP)添加到IP首部;經(jīng)過(guò)鏈路層的時(shí)候,會(huì)把幀類型(IP or ARP or RARP)添加到以太網(wǎng)首部。這些信息將被用于接收端的處理。

接收端收到數(shù)據(jù)后,要執(zhí)行跟發(fā)送端相反的解封操作,我們可以把發(fā)送端的數(shù)據(jù)封裝比喻成洗澡后一層層穿衣服,而接收端的操作,類似洗澡前一層層脫衣服,把首尾部剝離,獲取傳遞的原始數(shù)據(jù)。

因?yàn)榫W(wǎng)絡(luò)上的主機(jī)有不同字節(jié)序,現(xiàn)在要通過(guò)網(wǎng)絡(luò)傳輸,便需要約定統(tǒng)一的網(wǎng)絡(luò)字節(jié)序(大端序),采用小端序的主機(jī)在網(wǎng)絡(luò)傳輸數(shù)據(jù)的時(shí)候要轉(zhuǎn)為大端序。

點(diǎn)分十進(jìn)制表示法,很顯然,點(diǎn)分十進(jìn)制法和int32兩種表示法之間很容易相互轉(zhuǎn)換。

IPv4地址劃分為ABCDE五類,32位地址表示的數(shù)值空間有限,難以為互聯(lián)網(wǎng)上的所有聯(lián)網(wǎng)設(shè)備分配獨(dú)立的IP地址,所以便存在動(dòng)態(tài)分配、共享、公網(wǎng)+內(nèi)網(wǎng)地址轉(zhuǎn)化(NAT)等問(wèn)題,本質(zhì)上是為了解決IP地址不夠用的問(wèn)題。

IPv6使用128bit,2的128次方就非常大了,號(hào)稱可以為地球上每粒沙子分配一個(gè)ip地址。

IP數(shù)據(jù)報(bào)(網(wǎng)絡(luò)層)用IP地址、而以太網(wǎng)幀(鏈路層)則是用硬件(48位Mac)地址,ARP和RARP用于IP地址和硬件地址之間做映射(轉(zhuǎn)換)。

端口號(hào)來(lái)識(shí)別(區(qū)分)應(yīng)用,比如

主機(jī)A向主機(jī)B發(fā)送了一個(gè)IP報(bào),主機(jī)

B的內(nèi)核收到該IP報(bào)之后,應(yīng)該交給哪個(gè)應(yīng)用程序去處理呢?端口號(hào)就是用來(lái)干這個(gè)的,內(nèi)核會(huì)維護(hù)端口號(hào)到應(yīng)用程序之間的對(duì)應(yīng)關(guān)系。

比較常用的應(yīng)用層協(xié)議有約定的端口號(hào),也就是知名端口號(hào),而1024~5000之間的端口號(hào)是分配給TCP/IP臨時(shí)用的,而大于5000的另做他用。也就是說(shuō),你用TCP方式去連網(wǎng)絡(luò)服務(wù)器,本地為該socket分配的端口號(hào)會(huì)在1024~5000之間,這取決于操作系統(tǒng)的端口分配策略。

域名系統(tǒng)

域名系統(tǒng)(DNS)提供主機(jī)名字和IP地址之間的轉(zhuǎn)換,比如www.baidu.com是一個(gè)域名,應(yīng)用程序可以通過(guò)一個(gè)標(biāo)準(zhǔn)庫(kù)函數(shù)(gethostbyname)來(lái)獲得給定名字主機(jī)的IP地址,標(biāo)準(zhǔn)庫(kù)函數(shù)(gethostbyaddr)實(shí)現(xiàn)逆操作。

ip地址是一串?dāng)?shù)字,含義不清、也不便于記憶,主機(jī)名含義更清晰,www.baidu.com你就很容易記住,這也是為什么存在IP地址還需要主機(jī)名的原因。

剝洋蔥一樣,從協(xié)議棧由底向上升,即遵照鏈路層->網(wǎng)絡(luò)層->傳輸層->應(yīng)用層的順序,去掉各層協(xié)議添加的首尾部,將數(shù)據(jù)取出,交給最上層應(yīng)用程序,這個(gè)過(guò)程叫Demultiplexing,尊從書(shū)本的翻譯叫分用。



回顧前面封裝的描述,在傳輸層、網(wǎng)絡(luò)層、鏈路層,分別將端口號(hào)存入TCP/IP首部,將協(xié)議類型存入IP首部,將幀類型存入以太網(wǎng)幀首部。所以在接收端,將一層層拆掉首部,取出對(duì)應(yīng)信息,然后做分派,丟給不同模塊處理,上圖就是整個(gè)處理過(guò)程。

域名

、端口、TCP/IP分層模型、封裝、分用等概念。

你最好能記住TCP/IP鏈路層->網(wǎng)絡(luò)層->傳輸層->應(yīng)用層的四層劃分。

TCP segment、UDP datagram、IP datagram、IP fragment、以太網(wǎng)frame、以及IP層和鏈路層之間傳輸?shù)臄?shù)據(jù)單元packet,這些概念你最好分清楚,這樣交談的時(shí)候會(huì)顯得比較專業(yè)而不是很土。

數(shù)據(jù)封裝,多看幾遍你便能記住了。

TCP封裝格式:以太網(wǎng)首部(14)+IP首部(20)+TCP首部(20)+應(yīng)用數(shù)據(jù)+以太網(wǎng)尾部(4)

UDP封裝格式:以太網(wǎng)首部(14)+IP首部(20)+UDP首部(8)+應(yīng)用數(shù)據(jù)+以太網(wǎng)尾部(4)

應(yīng)用層協(xié)議在應(yīng)用層實(shí)現(xiàn),而傳輸層、網(wǎng)絡(luò)層、鏈路層都是在內(nèi)核實(shí)現(xiàn),所以想修改或者優(yōu)化底層協(xié)議很難,因?yàn)槟銕缀鮿?dòng)不了內(nèi)核,因?yàn)榫W(wǎng)絡(luò)上的大量設(shè)備OS你沒(méi)法一并改過(guò)來(lái),這就是所謂的網(wǎng)絡(luò)設(shè)備僵化問(wèn)題,HTTP3用UDP替代TCP,就是想在應(yīng)用層自己去實(shí)現(xiàn)可靠傳輸?shù)取?/p>

每個(gè)以太網(wǎng)幀有長(zhǎng)度限制(48~1500),網(wǎng)絡(luò)上每個(gè)設(shè)備也有對(duì)包的長(zhǎng)度限制,IP報(bào)大了就要分片,分片可能發(fā)生在發(fā)送端,也有可能發(fā)生在中間設(shè)備,但應(yīng)該盡量避免分片,IP報(bào)會(huì)帶有信息讓分片后可以重組,MTU的概念可以了解一下。

ICMP和IGMP邏輯上屬于網(wǎng)絡(luò)層,因?yàn)樗麄兪荌P協(xié)議的附屬協(xié)議,但實(shí)際上,ICMP和IGMP報(bào)文都被封裝為IP datagram傳輸,所以又可以把他們視為IP層之上的協(xié)議。

同樣ARP和RARP用于IP地址和硬件MAC地址相互轉(zhuǎn)換,邏輯上屬于鏈路層,但實(shí)際上arp和rarp報(bào)文跟IP datagram一樣,都被封裝成以太網(wǎng)Frame傳輸。

接收端收到以太網(wǎng)幀之后,會(huì)走分用流程,最終將原始數(shù)據(jù)交給應(yīng)用程序。

TCP/IP協(xié)議的應(yīng)用程序經(jīng)常使用socket編程接口。

有很多跟網(wǎng)絡(luò)相關(guān)的工具,比如ping、ifconfig、netstat、arp、tcpdump、wireshark等。

主機(jī)A都可以任意發(fā)一個(gè)IP報(bào)到主機(jī)B,網(wǎng)絡(luò)主機(jī)

之間是通過(guò)IP層實(shí)現(xiàn)路由轉(zhuǎn)發(fā)的,兩點(diǎn)之間的每個(gè)IP報(bào)都是獨(dú)立路由的,既然這樣,為什么還要建連?還要浪費(fèi)時(shí)間做A->B、B->A、A->B來(lái)回?直接把包發(fā)過(guò)去不就完了嗎?

假設(shè)通過(guò)AB建立的3個(gè)IP報(bào)的作用是表示AB之間的網(wǎng)絡(luò)連通性?哪又有什么作用?因?yàn)榫W(wǎng)絡(luò)是隨時(shí)變化的,此刻連通又不代表下一刻連通。建連之后似乎并不存在AB之間的真正連接,只是兩端OS層面維護(hù)的一個(gè)狀態(tài)(數(shù)據(jù)對(duì)象)?是虛擬連接?

建連到底是什么意思?客戶端發(fā)送一個(gè)IP報(bào)到服務(wù)器去發(fā)起連接?那跟傳輸數(shù)據(jù)的普通IP報(bào)又有什么區(qū)別?

雙工是什么意思?為什么socket關(guān)閉一半傳輸之后就不能發(fā)送數(shù)據(jù)了?網(wǎng)絡(luò)上IP報(bào)不是可以任意傳輸嗎?這個(gè)限制是哪個(gè)地方添加的?

擁塞控制是什么?Nagle是什么?滑動(dòng)窗口是什么?TCP為什么要?;??

socekt的編程接口和各種概念跟TCP/IP原理有怎樣的對(duì)應(yīng)關(guān)系?學(xué)完TCP/IP原理對(duì)理解socket編程有什么幫助?

沒(méi)有深究TCP/IP原理之前,我其實(shí)是有很多問(wèn)題的,只是做應(yīng)用程序開(kāi)發(fā),好像沒(méi)搞懂那些問(wèn)題也還可以湊合干,但終究是有點(diǎn)糊里糊涂,感覺(jué)不太爽。

本來(lái)我想一篇文章講清楚TCP/IP的主要內(nèi)容,但是寫(xiě)著寫(xiě)著發(fā)現(xiàn),這樣文章會(huì)非常長(zhǎng),所以我決定多寫(xiě)幾篇,每篇都講清楚一個(gè)主題。

  • 協(xié)議格式
  • TCP、UDP的區(qū)別,建連、擁塞控制,面向連接和可靠傳輸?shù)降资鞘裁春x?基于UDP編程怎么實(shí)現(xiàn)可靠傳輸?
  • 編程接口:socket TCP/UDP編程
  • 互聯(lián)網(wǎng)應(yīng)用層協(xié)議:http、http2、http3(quic)

    當(dāng)前文章:通俗易懂講解什么是TCP/IP
    分享鏈接:http://jinyejixie.com/news21/104471.html

    成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營(yíng)銷推廣、搜索引擎優(yōu)化、響應(yīng)式網(wǎng)站、網(wǎng)站導(dǎo)航動(dòng)態(tài)網(wǎng)站、做網(wǎng)站

    廣告

    聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

    成都定制網(wǎng)站建設(shè)
    利津县| 霍城县| 万全县| 玛纳斯县| 利川市| 澎湖县| 大石桥市| 韶关市| 五华县| 韶关市| 凤阳县| 五华县| 武夷山市| 方城县| 康平县| 龙南县| 洮南市| 青海省| 洛浦县| 琼海市| 本溪市| 洪雅县| 绥中县| 麻江县| 靖州| 北宁市| 兰考县| 西乡县| 互助| 宝山区| 新宁县| 大渡口区| 高阳县| 历史| 赤峰市| 佳木斯市| 谷城县| 长沙市| 垦利县| 大安市| 清水县|