近期事情,跟網(wǎng)絡(luò)協(xié)議干系,這讓我天然會更深開學(xué)習(xí)網(wǎng)絡(luò)協(xié)議,而之前很長一段時間,我對網(wǎng)絡(luò)協(xié)議的了解都停留在比力淺的層面。
好比:TCP是面向毗連的、可靠傳輸,而UDP好壞毗連的、不成靠傳輸,TCP建連必要3次握手,會形成delay,UDP更快。
好比:socket編程,辦事器socket create、bind、listen、accept、read/write、shutdown/close,客戶端socket create、connect、read/write、shutdown/close,再加上epoll/select這幾下子。
再好比:我曉得網(wǎng)絡(luò)編程要無視SIGPIPE信號不然會掛,read前往0代表對端主動關(guān)閉,非壅閉的read要放在循環(huán)里要思索前往值,多路復(fù)用以及壅閉、非壅閉的區(qū)別。
TCP/UDP的區(qū)別上,我是如此了解的:從北京到杭州,TCP相當(dāng)于修了一條高鐵線路(建連)再通車發(fā)貨(傳輸數(shù)據(jù)),而UDP相當(dāng)于寄快遞,丟了不管(直接傳輸數(shù)據(jù))。
外表的了解對不合錯誤?可以說對,也可以說不合錯誤。關(guān)于使用步驟員來說,有了外表的熟悉+熟習(xí)socket編程接口,夠了嗎?不夠嗎?
大物理學(xué)家費(fèi)曼提出一個高效的費(fèi)曼學(xué)習(xí)法,即從成績動手,試著把成績都講出來,以教代學(xué),一旦你能把成績都講清晰,便學(xué)會了。以是我想實(shí)驗(yàn)一下把TCP/IP講清晰,借此讓本人學(xué)明白,特地協(xié)助一下讀者。
固然《TCP/IP詳解卷1》是一本關(guān)于互聯(lián)網(wǎng)協(xié)議族很嚴(yán)謹(jǐn)細(xì)致的書,但在我看來,它略微有點(diǎn)難懂,約莫必要讀幾遍,才干心心相印。固然我沒有才能把這個成績說的更好,但由于我履歷過從稀里懵懂到稍有所悟的歷程,這約莫是大師不成比的,我將盡力用普通易懂的言語把TCP/IP干系的知識講清晰。
TCP/IP協(xié)議族是一組協(xié)議的聚集,也叫互聯(lián)網(wǎng)協(xié)議族,用來完成互聯(lián)網(wǎng)上主機(jī)之間的互相通訊。TCP和IP只是此中的2個協(xié)議,也是很緊張的2個協(xié)議,以是用TCP/IP來定名這個互聯(lián)網(wǎng)協(xié)議族,實(shí)踐上,它還包含其他協(xié)議,好比UDP、ICMP、IGMP、ARP/RARP等。
大學(xué)《盤算機(jī)網(wǎng)絡(luò)》教科書上有經(jīng)典的網(wǎng)絡(luò)ISO七層模子,但七層區(qū)分太細(xì)了,稍顯繁瑣,不容易記取。
互聯(lián)網(wǎng)協(xié)議族TCP/IP按粗粒度的四層區(qū)分,兩種區(qū)分的比力圖讓互干系系一清二楚。
分層是盤算機(jī)范疇的常用本事,好比互聯(lián)網(wǎng)后端的三層架構(gòu)“接入-邏輯-存儲”就是分層頭腦的典范使用。
分層是為了斷絕,通太過層區(qū)分本能機(jī)能,拆解成績,層與層之間商定接口,屏蔽完成細(xì)節(jié)。
TCP/IP自下到上區(qū)分為鏈路層、網(wǎng)絡(luò)層、傳輸層、使用層。下屬向表層提供才能,表層使用下屬的才能提供更高的籠統(tǒng)。
1. 鏈路層,也稱網(wǎng)絡(luò)接口層,包含利用體系的裝備驅(qū)動步驟和網(wǎng)卡,它們一同處理與傳輸前言(光纖等)的物理接口細(xì)節(jié)。
2. 網(wǎng)絡(luò)層,也就是IP層,賣力處理IP datagram在網(wǎng)絡(luò)中的傳輸,IP層傳輸?shù)氖荌P datagram,借助路由表,把IP datagram從網(wǎng)絡(luò)的一端傳輸?shù)搅硪欢耍喍灾?strong>IP完成包的路由傳輸,IP協(xié)媾和路由器事情在網(wǎng)絡(luò)層。
3. 傳輸層,提供端到端之間的通訊,包含提供面向毗連和高可靠性的TCP,以及無毗連不成靠的UDP。貌似TCP更好,但實(shí)踐不是如此,UDP由于不必要建連開支,以是更快,使用得也很廣,好比新一代互聯(lián)網(wǎng)協(xié)議HTTP3就從TCP轉(zhuǎn)向UDP,應(yīng)依據(jù)順應(yīng)場景選擇傳輸層協(xié)議。
4. 使用層,跟使用干系,不同使用處理不同成績,必要不同的使用層協(xié)議。
鏈路層處理數(shù)據(jù)在前言上的傳輸,以及主機(jī)與網(wǎng)卡、光纖等打交道的細(xì)節(jié)。由于與硬件干系,以是必要借助體系的驅(qū)動步驟,鏈路層協(xié)議就是界說這些細(xì)節(jié)的,好比怎樣把數(shù)據(jù)從網(wǎng)卡發(fā)送到光纖,接納什么格式編碼等,它處理的數(shù)據(jù)在前言上表現(xiàn)、活動的成績。
光有鏈路層功效一定是不夠的,網(wǎng)絡(luò)上有不計其數(shù)的機(jī)器,主機(jī)A與B通訊,你不克不及將數(shù)據(jù)發(fā)到主機(jī)C,以是模仿實(shí)際,要為主機(jī)分派網(wǎng)絡(luò)地點(diǎn),經(jīng)過IP地點(diǎn)去標(biāo)識網(wǎng)絡(luò)中的一臺主機(jī),發(fā)送一個數(shù)據(jù)包,必要準(zhǔn)確路由到目標(biāo)地,這就好比你從家到公司,要顛末哪些途徑,必要輿圖,而路由表就相似這張輿圖。IP處理的是數(shù)據(jù)包在網(wǎng)絡(luò)中的傳輸路由的成績。
有了網(wǎng)絡(luò)層的傳輸路由才能,還不夠,由于IP報在傳輸歷程中約莫丟包,好比正中履歷過的路由器緩沖區(qū)滿了便會丟包,如此不成靠,假如必要可靠傳輸的才能,便必要傳輸層基于IP層,提供更多的才能,TCP處理了可靠性成績。具體而言,假如丟包了,TCP層會賣力超時重傳,它經(jīng)過吸收確認(rèn)和重傳機(jī)制確保了可靠傳輸。別的,由于IP報都是獨(dú)立路由的,以是從主機(jī)A到主機(jī)B,一份數(shù)據(jù)被拆分紅x、y兩個IP報先后發(fā)送,這2個包約莫選擇不同的傳輸途徑,如此有約莫y包先于x包抵達(dá),但我們渴望在吸收端(主機(jī)B)規(guī)復(fù)這個數(shù)據(jù)的信息,但我們無法控制IP報的抵達(dá)排序,以是,我們必要在吸收端規(guī)復(fù)數(shù)據(jù),我只必要在x、y包里紀(jì)錄它屬于數(shù)據(jù)塊的哪個局部,然后重組這份數(shù)據(jù),這正是TCP做的,它會重新組裝IP報,從而確保排序性,遞交給使用層。
偶爾分并不必要確保可靠性溫和序性,這便是UDP能提供的,它只是簡便的把數(shù)據(jù)封裝成IP報,然后經(jīng)過IP層路由發(fā)送到目標(biāo)端。
再往上,便是使用層協(xié)議了,好比http,又好比游戲辦事器自界說協(xié)議,使用層協(xié)議通常基于TCP大概UDP做傳輸。
什么是協(xié)議?懶得去翻協(xié)議的種種威望界說了,我以為協(xié)議就是商定,跟實(shí)際生存中協(xié)議這個詞涵義差不多。網(wǎng)絡(luò)協(xié)議就是通訊兩邊協(xié)同恪守的商定,更具體一點(diǎn),就是界說數(shù)據(jù)在網(wǎng)絡(luò)上傳輸?shù)母袷健⒍苏土鞒獭?/p>
由于網(wǎng)絡(luò)是分層模子,不同層有不同層的作用,以是為各層界說各層的端正,各層對應(yīng)的各層協(xié)議。
前方講了TCP/IP協(xié)議族包含很多協(xié)議,這些協(xié)議分屬不同的分層,承當(dāng)不同的作用。
使用層和傳輸層使用端到端(end-to-end)協(xié)議,網(wǎng)絡(luò)層提供的是逐跳(hop-by-hop)協(xié)議。
A給B經(jīng)過網(wǎng)絡(luò)傳送一塊數(shù)據(jù),可以假想僅僅是傳輸這塊原始數(shù)據(jù)是不夠的,由于網(wǎng)絡(luò)傳輸歷程中,網(wǎng)絡(luò)包到了某個路由器,必要轉(zhuǎn)發(fā),而轉(zhuǎn)發(fā)必需依托數(shù)據(jù)包的一些附加信息,好比目標(biāo)機(jī)器。
發(fā)送端在發(fā)送數(shù)據(jù)的時分,將原始數(shù)據(jù)依照協(xié)議格式加上一些控制信息,包裝成可在網(wǎng)絡(luò)上準(zhǔn)確傳輸數(shù)據(jù)包的歷程叫封裝。
TCP/IP協(xié)議族是層層封裝的,從使用層到鏈路層,每顛末一層都要添加一些分外信息(首、尾部)。
改準(zhǔn)確的說,在IP和鏈路層傳輸?shù)臄?shù)據(jù)單位叫分組(Packet),分組既可以是一個IP datagram也可以是IP datagram的一個分片(fragment)。
UDP的封裝跟TCP略有不同,主要表如今顛末傳輸層(UDP)之后添加的是8字節(jié)UDP首部,產(chǎn)生UDP datagram。
封裝歷程中,顛末TCP/UDP層的時分,會把端標(biāo)語添加到TCP/UDP首部;顛末IP層的時分,會把協(xié)議典范(TCP or UDP or ICMP or IGMP)添加到IP首部;顛末鏈路層的時分,會把幀典范(IP or ARP or RARP)添加到以太網(wǎng)首部。這些信息將被用于吸收端的處理。
吸收端收到數(shù)據(jù)后,要實(shí)行跟發(fā)送端相反的解封利用,我們可以把發(fā)送端的數(shù)據(jù)封裝比如成沐浴后一層層穿衣服,而吸收端的利用,相似沐浴前一層層脫衣服,把首尾部剝離,獲取轉(zhuǎn)達(dá)的原始數(shù)據(jù)。
由于網(wǎng)絡(luò)上的主機(jī)有不同字節(jié)序,如今要經(jīng)過網(wǎng)絡(luò)傳輸,便必要商定一致的網(wǎng)絡(luò)字節(jié)序(大端序),接納小端序的主機(jī)在網(wǎng)絡(luò)傳輸數(shù)據(jù)的時分要轉(zhuǎn)為大端序。
互聯(lián)網(wǎng)上每個接口都有一個唯一的網(wǎng)絡(luò)地點(diǎn),也叫IP地點(diǎn),IP地點(diǎn)有IPv4和IPv6兩個版本,IPv4是32位4字節(jié)的整數(shù),每個字節(jié)(8bit)的取值范圍是0~255,以是可以把4字節(jié)的IPv4用四個點(diǎn)分開的byte值表現(xiàn),好比140.252.13.88,每個十進(jìn)制數(shù)值對應(yīng)32位整數(shù)中的每個字節(jié),這種表現(xiàn)法叫點(diǎn)分十進(jìn)制表現(xiàn)法,很顯然,點(diǎn)分十進(jìn)制法和int32兩種表現(xiàn)法之間很容易互相轉(zhuǎn)換。
IPv4地點(diǎn)區(qū)分為ABCDE五類,32位地點(diǎn)表現(xiàn)的數(shù)值空間僅限,難以為互聯(lián)網(wǎng)上的一切聯(lián)網(wǎng)裝備分派獨(dú)立的IP地點(diǎn),以是便存在動態(tài)分派、共享、公網(wǎng)+內(nèi)網(wǎng)地點(diǎn)轉(zhuǎn)化(NAT)等成績,實(shí)質(zhì)上是為了處理IP地點(diǎn)不夠用的成績。
IPv6使用128bit,2的128次方就十分大了,號稱可以為地球上每粒沙子分派一個ip地點(diǎn)。
IP數(shù)據(jù)報(網(wǎng)絡(luò)層)用IP地點(diǎn)、而以太網(wǎng)幀(鏈路層)則是用硬件(48位Mac)地點(diǎn),ARP和RARP用于IP地點(diǎn)和硬件地點(diǎn)之間做映射(轉(zhuǎn)換)。
TCP/UDP接納16位端標(biāo)語來識別(區(qū)分)使用,好比主機(jī)A向主機(jī)B發(fā)送了一個IP報,主機(jī)B的內(nèi)核收到該IP報之后,應(yīng)該交給哪個使用步驟去向理呢?端標(biāo)語就是用來干這個的,內(nèi)核會維護(hù)端標(biāo)語到使用步驟之間的對應(yīng)干系。
比力常用的使用層協(xié)議有商定的端標(biāo)語,也就是著名端標(biāo)語,而1024~5000之間的端標(biāo)語是分派給TCP/IP暫且用的,而大于5000的另做他用。也就是說,你用TCP辦法去連網(wǎng)絡(luò)辦事器,當(dāng)?shù)貫樵搒ocket分派的端標(biāo)語會在1024~5000之間,這取決于利用體系的端口分派戰(zhàn)略。
域名體系(DNS)提供主機(jī)名字和IP地點(diǎn)之間的轉(zhuǎn)換,好比www.baidu.com是一個域名,使用步驟可以經(jīng)過一個標(biāo)準(zhǔn)庫函數(shù)(gethostbyname)來取得給定名字主機(jī)的IP地點(diǎn),標(biāo)準(zhǔn)庫函數(shù)(gethostbyaddr)完成逆利用。
ip地點(diǎn)是一串?dāng)?shù)字,涵義不清、也不便利于影象,主機(jī)名涵義更明晰,www.baidu.com你就很容易記取,這也是為什么存在IP地點(diǎn)還必要主機(jī)名的緣故。
吸收端吸收到以太網(wǎng)數(shù)據(jù)幀(Frame)之后,必要像剝洋蔥一樣,從協(xié)議棧由底向上升,即依照鏈路層->網(wǎng)絡(luò)層->傳輸層->使用層的排序,去掉各層協(xié)議添加的首尾部,將數(shù)據(jù)取出,交給最表層使用步驟,這個歷程叫Demultiplexing,尊從冊本的翻譯叫分用。
回憶前方封裝的形貌,在傳輸層、網(wǎng)絡(luò)層、鏈路層,分散將端標(biāo)語存入TCP/IP首部,將協(xié)議典范存入IP首部,將幀典范存入以太網(wǎng)幀首部。以是在吸收端,將一層層拆掉首部,取出對應(yīng)信息,然后做分派,丟給不同模塊處理,上圖就是整個處理歷程。
本文講了地點(diǎn)、域名、端口、TCP/IP分層模子、封裝、分用等看法。
你最好能記取TCP/IP鏈路層->網(wǎng)絡(luò)層->傳輸層->使用層的四層區(qū)分。
TCP segment、UDP datagram、IP datagram、IP fragment、以太網(wǎng)frame、以及IP層和鏈路層之間傳輸?shù)臄?shù)據(jù)單位packet,這些看法你最好分清晰,如此扳談的時分會顯得比力專業(yè)而不是很土。
數(shù)據(jù)封裝,多看幾遍你便能記取了。
TCP封裝格式:以太網(wǎng)首部(14)+IP首部(20)+TCP首部(20)+使用數(shù)據(jù)+以太網(wǎng)尾部(4)
UDP封裝格式:以太網(wǎng)首部(14)+IP首部(20)+UDP首部(8)+使用數(shù)據(jù)+以太網(wǎng)尾部(4)
使用層協(xié)議在使用層完成,而傳輸層、網(wǎng)絡(luò)層、鏈路層都是在內(nèi)核完成,以是想修正大概優(yōu)化底層協(xié)議很難,由于你幾乎動不了內(nèi)核,由于網(wǎng)絡(luò)上的多量裝備OS你沒法一并改正來,這就是所謂的網(wǎng)絡(luò)裝備僵化成績,HTTP3用UDP交換TCP,就是想在使用層本人去完成可靠傳輸?shù)取?/p>
每個以太網(wǎng)幀有長度限定(48~1500),網(wǎng)絡(luò)上每個裝備也有對包的長度限定,IP報大了就要分片,分片約莫產(chǎn)生在發(fā)送端,也有約莫產(chǎn)生在正中裝備,但應(yīng)該盡力制止分片,IP報會帶有信息讓分片后可以重組,MTU的看法可以了解一下。
ICMP和IGMP邏輯上屬于網(wǎng)絡(luò)層,由于他們是IP協(xié)議的從屬協(xié)議,但實(shí)踐上,ICMP和IGMP報文都被封裝為IP datagram傳輸,以是又可以把他們視為IP層之上的協(xié)議。
相反ARP和RARP用于IP地點(diǎn)和硬件MAC地點(diǎn)互相轉(zhuǎn)換,邏輯上屬于鏈路層,但實(shí)踐上arp和rarp報文跟IP datagram一樣,都被封裝成以太網(wǎng)Frame傳輸。
吸收端收到以太網(wǎng)幀之后,會走分用流程,終極將原始數(shù)據(jù)交給使用步驟。
TCP/IP協(xié)議的使用步驟常常使用socket編程接口。
有很多跟網(wǎng)絡(luò)干系的東西,好比ping、ifconfig、netstat、arp、tcpdump、wireshark等。
一年前,我對網(wǎng)絡(luò)編程這塊,頭腦里充溢疑問。
眾所周知,TCP建連三次握手和斷連四次握手,但如前所述,任何時分,從主機(jī)A都可以隨意發(fā)一個IP報到主機(jī)B,網(wǎng)絡(luò)主機(jī)之間是經(jīng)過IP層完成路由轉(zhuǎn)發(fā)的,兩點(diǎn)之間的每個IP報都是獨(dú)立路由的,既然如此,為什么還要建連?還要糜費(fèi)時間做A->B、B->A、A->B往返?直接把包發(fā)已往不就完了嗎?
假定經(jīng)過AB創(chuàng)建的3個IP報的作用是表現(xiàn)AB之間的網(wǎng)絡(luò)連通性?哪又有什么作用?由于網(wǎng)絡(luò)是隨時厘革的,如今連通又不代表下一刻連通。建連之后仿佛并不存在AB之間的真正毗連,只是兩頭OS層面維護(hù)的一個形態(tài)(數(shù)據(jù)目標(biāo))?是假造毗連?
建連畢竟是什么意思?客戶端發(fā)送一個IP報到辦事器去倡導(dǎo)毗連?那跟傳輸數(shù)據(jù)的平凡IP報又有什么區(qū)別?
雙工是什么意思?為什么socket關(guān)閉一半傳輸之后就不克不及發(fā)送數(shù)據(jù)了?網(wǎng)絡(luò)上IP報不是可以隨意傳輸嗎?這個限定是哪個場合添加的?
擁塞控制是什么?Nagle是什么?滑動窗口是什么?TCP為什么要保活?
socekt的編程接口和種種看法跟TCP/IP原理有怎樣的對應(yīng)干系?學(xué)完TCP/IP原理對了解socket編程有什么協(xié)助?
沒有窮究TCP/IP原理之前,我但是是有很多成績的,只是做使用步驟開發(fā),仿佛沒搞懂那些成績也還可以將就干,但畢竟是有點(diǎn)糊里懵懂,以為不太爽。
原本我想一篇文章講清晰TCP/IP的主要內(nèi)容,但是寫著寫著發(fā)覺,如此文章會十分長,以是我決定多寫幾篇,每篇都講清晰一個主題。
版權(quán)聲明:本文來自互聯(lián)網(wǎng)整理發(fā)布,如有侵權(quán),聯(lián)系刪除
原文鏈接:http://www.freetextsend.comhttp://www.freetextsend.com/wangluozixun/53613.html