IP报文字段
ip報文字段
- 4位版本號
- 4位首部長度
- 8位服務(wù)類型
- 16位總長度
- 16位標(biāo)識, 3位標(biāo)志, 13位片偏移
- 8位生存時間TTL
- 8位協(xié)議號
- 16位首部檢驗(yàn)和
- 32位源IP地址和32位目的IP地址
- 后面就是一個完整的TCP數(shù)據(jù)報或者UDP數(shù)據(jù)報
4位版本號
代表是ipv4, 還是ipv6協(xié)議4位首部長度
代表ip的報文頭部長度, 變長的
8位服務(wù)類型
就是代表這個ip更注重于什么要求
16位總長度
ip報文的總長度, 最大為2的16次方為64K, 和UDP一樣最大長度為64K 但是他們兩個有個區(qū)別是, UDP不支持自動的拆包和組包 想要實(shí)現(xiàn)需要用戶自己在應(yīng)用層實(shí)現(xiàn). 但是ip協(xié)議, 支持自動的拆包和組包 下面要介紹的三個字段則是用來輔助拆包和組包的16位標(biāo)識, 3位標(biāo)志, 13位片偏移
這三個字段是用來實(shí)現(xiàn)拆包和組包的, 當(dāng)TCP報文長度超出范圍時, 就會進(jìn)行拆包和組包
下面就來說明一下, 比如我現(xiàn)在有a, b, c, d 四個ip包, 他們是由同一個TCP報文拆解下來的.
16位標(biāo)識 : 代表這幾個包是屬于同一個數(shù)據(jù)報的嗎, 如果16位標(biāo)識都相同, 那么就代表屬于同一個報文中的.
13位位偏移 : 按照偏移量的大小, 來確認(rèn)先后的順序. a的偏移量小于b的偏移量, b小于c, c小于d . 那么先后的順序就是 a, b, c, d 防止"后發(fā)先至"
3位標(biāo)志 : 這個的作用只有一個確認(rèn)是否到達(dá)結(jié)尾, 就相當(dāng)于鏈表的NULL
比如a:0 > b:0 > c :0 > d : 1
d為1, 代表此處的組裝就可以結(jié)束了, 因?yàn)樗亲詈笠粋€需要組裝的了
8位生存時間TTL
表示一個數(shù)據(jù)報在網(wǎng)絡(luò)上能傳輸多久(代表可用經(jīng)過幾個路由器轉(zhuǎn)發(fā))
初始值一般是64(可配置)
每次進(jìn)過一個路由器轉(zhuǎn)發(fā), 他的值就會減1如果減到了0, 這個包就認(rèn)為不可達(dá), 將會被丟棄
8位協(xié)議號
8位協(xié)議號, 代表你傳輸層應(yīng)用的是什么協(xié)議
如果是6那么就是TCP, 如果是17那么就是UDP
16位首部檢驗(yàn)和
16位首部檢驗(yàn)和的作用是用來檢測ip報文頭部的完整性
32位源IP地址和32位目的IP地址
ip地址其實(shí)是一個32位的整形二進(jìn)制數(shù)字, 平常我們寫的192.168.0.1, 這種叫做點(diǎn)分十進(jìn)制, 是為了我們?nèi)死斫馄饋矸奖? 就將每8位二進(jìn)制, 化成十進(jìn)制
后面就是一個完整的TCP數(shù)據(jù)報或者UDP數(shù)據(jù)報
值得一提的是TCP的總長度在TCP報文的頭部并沒有提及, 需要配合著IP報文才能算出.
TCP的報文數(shù)據(jù)長度 = (IP數(shù)據(jù)報總長度 - IP首部長度) - TCP的報頭長度
總結(jié)
- 上一篇: 简谈TCP的八个特性
- 下一篇: Go中切片扩容原理