有TCP厂抽、 UDP、 ICMP和IGMP數(shù)據(jù)都通過(guò)IP數(shù)據(jù)報(bào)傳輸贺辰。
Internte 是特指使用tcp/ip協(xié)議的網(wǎng)絡(luò)嵌施。而internet是泛指使用協(xié)議通訊的網(wǎng)絡(luò)。
ip
使用一種“我盡力送”吃靠,“送完我就不管”的方式進(jìn)行數(shù)據(jù)數(shù)據(jù)報(bào)的投遞足淆。
也就是巢块,不可靠的傳送,不保存狀態(tài)的傳送族奢。
有了數(shù)據(jù)我就封裝送出去丹鸿,至于數(shù)據(jù)報(bào)的先后達(dá)到順序,是否能夠到達(dá)不是ip負(fù)責(zé)的事情靠欢。
其上層也就是傳輸層負(fù)責(zé)可靠性之類(lèi)的。
ip數(shù)據(jù)報(bào)
至于為什么帶了兩個(gè)物理地址的頭部,還有一個(gè)IPv4類(lèi)型的值:0x0800
我就也不知道了掷空。
從0800后面開(kāi)始的是ip報(bào)的內(nèi)容。
- 版本號(hào) 4bit是有半位
ipv4為4疼电,ipv6為6。 - IHL 4bit
保存ipv4頭部的32位字(也就是4字節(jié)大小)的數(shù)量区丑。表示的值最大是15修陡,所以頭部最長(zhǎng)為60字節(jié)可霎。
該值默認(rèn)為5。也就是20拾因。
該字段控制了選項(xiàng)的最大大小:最長(zhǎng)為15*4=60b的頭部旷余,所以選項(xiàng)的最大長(zhǎng)度為40B
也是記錄了有效荷載部分從哪里開(kāi)始 - Ds區(qū)分服務(wù)
區(qū)分服務(wù)代碼點(diǎn)
沒(méi)看懂 - ECN顯式擁塞通知
路由如果有探測(cè)流量擁堵的能力。當(dāng)路由探測(cè)到當(dāng)前流量擁堵蠢熄,那么會(huì)將流經(jīng)的數(shù)據(jù)報(bào)的改字段設(shè)置為2
表示我這里的流量太大了炉旷。
當(dāng)目的主機(jī)收到該數(shù)據(jù)報(bào)的時(shí)候,檢測(cè)到ECN為2窘行,會(huì)通知發(fā)送方降低發(fā)送速度。
這是避免和處理網(wǎng)絡(luò)擁塞的方法之一罐盔。 - 總長(zhǎng)度 16bit
是IPv4數(shù)據(jù)報(bào)的總長(zhǎng)。所以這個(gè)長(zhǎng)度和IHL長(zhǎng)度的差壁熄,可以計(jì)算出數(shù)據(jù)部分的起始位置和長(zhǎng)度碳竟。
因?yàn)殚L(zhǎng)為16bit(一個(gè)int大小)莹桅,所以可以攜帶65535字節(jié)數(shù)據(jù)。
如果長(zhǎng)度太小懂拾,會(huì)被填充铐达。
我的電腦上都被填充為66字節(jié)。還有54字節(jié)的瓮孙。
雖然可以攜帶65535字節(jié)的數(shù)據(jù)选脊,但是數(shù)據(jù)鏈路層的MTU不允許脸甘。所以通常分組
該字段指明了數(shù)據(jù)到哪里結(jié)束。
ip數(shù)據(jù)報(bào)最小為48或46钝的,如果小于就被填充铆遭,是在以太網(wǎng)幀中被填充。
但是ipv4有一個(gè)576字節(jié)的限制疚脐,也一個(gè)ipv4數(shù)據(jù)報(bào)總大小為576,如果選項(xiàng)最大為60B望薄,那么攜帶512B的有效荷載呼畸。 - 標(biāo)識(shí) 16bit
主要是數(shù)據(jù)報(bào)分片以后,不會(huì)和別的分片混淆蛮原,依然能夠組裝。
后面講 - TTL最大路由跳數(shù)(time to live) 8bit
一個(gè)數(shù)據(jù)包可以經(jīng)過(guò)的路由器個(gè)數(shù)花嘶。上圖的是0x80蹦漠,也就是128個(gè)。
當(dāng)該值為0時(shí)笛园,被丟棄。會(huì)返回一個(gè)icmp
主要是為了防止路由環(huán)路的埋同。 - 協(xié)議 8bit
數(shù)據(jù)報(bào)攜帶數(shù)據(jù)的類(lèi)型棵红。也就是TCP還UDP
TCP為6
udp為17
ICMP為1
現(xiàn)在主要用于識(shí)別其中封裝的協(xié)議是否為一種傳輸層協(xié)議。
還有其他的類(lèi)型,其他的值楼熄。 - 頭部校驗(yàn)和 16bit
ip不檢查數(shù)據(jù)報(bào)有效荷載(也就是攜帶數(shù)據(jù)的有效性浩峡。)
只檢測(cè)頭部信息的正確性
所以需要一種工具來(lái)檢測(cè)數(shù)據(jù)的正確性错敢。
當(dāng)數(shù)據(jù)報(bào)經(jīng)過(guò)一臺(tái)路由器時(shí),TTL變稚茅,所以檢驗(yàn)和也要變。
在接收到ipv4數(shù)據(jù)報(bào)時(shí)亚享,主機(jī)(或路由)從新計(jì)算一遍校驗(yàn)和,如果出錯(cuò)直接丟棄侈沪,并不會(huì)發(fā)送差錯(cuò)信息晚凿。
高層需要實(shí)現(xiàn)重發(fā)亭罪。 - 兩個(gè)ip地址64bit
- ip選項(xiàng)歼秽。
該程度可變,最長(zhǎng)320bit箩祥,40個(gè)字節(jié)肆氓。
暫時(shí)沒(méi)遇到啊
以上就是ip的報(bào)頭了。
校驗(yàn)和
Internet校驗(yàn)和算法:
1.待校驗(yàn)的相鄰字節(jié)成對(duì)組成16比特整數(shù)并計(jì)算其和的二進(jìn)制反碼(二進(jìn)制反碼求和).
2.生成校驗(yàn)和,校驗(yàn)和區(qū)域本身應(yīng)當(dāng)先置0,并和待校驗(yàn)數(shù)據(jù)相加,其和進(jìn)行二進(jìn)制反碼運(yùn)算后賦給校驗(yàn)和區(qū)域.
3.檢查校驗(yàn)和,將所有字節(jié),包括校驗(yàn)和,進(jìn)行相加并求二進(jìn)制反碼.如果結(jié)果為全1(即二進(jìn)制反碼算術(shù)中的0),檢查通過(guò).
二進(jìn)制反碼求和:從低位到高位逐列進(jìn)行和計(jì)算,如果最高位(16位)進(jìn)位,則得到的結(jié)果加1,一直循環(huán)到最高位沒(méi)有進(jìn)位為止.最后把得到的結(jié)果取反.程序?qū)崿F(xiàn)如下:
short checksum(unsigned short *buf, int nwords)
{
//一個(gè)大于16位的變量
unsigned long sum;
//低位開(kāi)始疊加盲泛,每次16bit
for (sum = 0; nwords > 0; nwords--)
sum += *buf++;
//一個(gè)大于16位的值键耕,如果左移16位不是0,表明發(fā)生進(jìn)位
while (sum >> 16)
//進(jìn)位的值都是1屈雄,然后再加上原來(lái)的sum,但是使用0xffff將高位清空村视,也就是進(jìn)位清空
//只剩下低16位的值
sum = (sum >> 16) + (sum & 0xffff);
return ~sum;
}
ip轉(zhuǎn)發(fā)
如果目的主機(jī)和發(fā)送方位于同一子網(wǎng)中蚁孔,那么直接將數(shù)據(jù)幀扔該目的主機(jī)。(通常是最后階段了)
如果不是位于同一網(wǎng)絡(luò)中杠氢,那么扔給路由器,讓路由器處理绞旅。
ip層包括一些位移內(nèi)存中的信息成為路由表或轉(zhuǎn)發(fā)表温艇。每次轉(zhuǎn)發(fā)都需要從中查找信息。
路由和主機(jī)的區(qū)別
主機(jī)只會(huì)發(fā)送他生成的數(shù)據(jù)幀勺爱,如果接收到數(shù)據(jù)幀要不接受,要么直接丟棄卫旱,不會(huì)轉(zhuǎn)發(fā)绣否。
路由會(huì)轉(zhuǎn)發(fā)別的主機(jī)或路由發(fā)送來(lái)的數(shù)據(jù)幀。
設(shè)備接收到數(shù)據(jù)幀
當(dāng)設(shè)備接受到一個(gè)數(shù)據(jù)幀以后蒜撮,數(shù)據(jù)鏈路層模塊判斷:數(shù)據(jù)幀的目的地址(物理地址),如果是本設(shè)備地址或是廣播組播之類(lèi)的地址取逾,那么接受苹支,(否則直接丟棄)。交給ip模塊债蜜。
ip模塊在判斷,數(shù)據(jù)報(bào)中的目的ip地址是否是本機(jī)地址(或是廣播之類(lèi)地址)儒洛,如果是狼速,那么接受。
如果不是:
- 本機(jī)是一臺(tái)主機(jī)。
直接丟棄數(shù)據(jù)報(bào) - 本機(jī)是一臺(tái)路由器
路由器會(huì)轉(zhuǎn)發(fā)該數(shù)據(jù)報(bào)惊完。
ip轉(zhuǎn)發(fā)
每個(gè)路由保存一個(gè)ip轉(zhuǎn)發(fā)表(也就是路由表)处硬。用于判斷數(shù)據(jù)報(bào)的下一跳。
表中每條包含:目的ip地址郁油,掩碼,下一跳ip,接口苟径。
當(dāng)路由進(jìn)行數(shù)據(jù)報(bào)轉(zhuǎn)發(fā)時(shí):
首先檢查數(shù)據(jù)報(bào)中的目的地址(ip地址),然后進(jìn)行最長(zhǎng)前綴匹配算法蟆盐。
將該ip與轉(zhuǎn)發(fā)表中的掩碼進(jìn)行與運(yùn)算遭殉,結(jié)果中1最多的那個(gè)那條表示匹配最好。
將其下一跳地址作為該數(shù)據(jù)報(bào)的目的地址(ip)险污。
如果沒(méi)有發(fā)現(xiàn)匹配條目,送到默認(rèn)路由拯腮。再不行返回主機(jī)不可達(dá)蚁飒。
ip數(shù)據(jù)報(bào)的主機(jī)處理
接受端 主機(jī)模式
- 強(qiáng)主機(jī)模式
只有當(dāng)目的ip地址與數(shù)據(jù)報(bào)到達(dá)的借口配置的ip地址相同時(shí),才將數(shù)據(jù)包交付到本地協(xié)議棧 - 弱主機(jī)模式
數(shù)據(jù)報(bào)的目的ip與主機(jī)的任意一個(gè)接口配置的ip地址相同時(shí)琼懊,就將數(shù)據(jù)報(bào)交付給本地協(xié)議棧
發(fā)送端
又是什么源地址選擇算法