Linux 系统应用编程——网络编程(TCP/IP 数据包格式解析)
圖中括號(hào)中的數(shù)字代表的是當(dāng)前域所占的空間大小,單位是bit位。
黃色的是數(shù)據(jù)鏈路層的頭部,一共14字節(jié)
綠色的部分是IP頭部,一般是20字節(jié)
紫色部分是TCP頭部,一般是20字節(jié)
最內(nèi)部的是數(shù)據(jù)包內(nèi)容
黃色部分:鏈路層
目的MAC:當(dāng)前step目的主機(jī)的mac地址
源MAC:當(dāng)前step的源主機(jī)的mac地址
類型:指定網(wǎng)絡(luò)層所用的協(xié)議類型,通常是IP協(xié)議,0x0800
綠色部分:網(wǎng)絡(luò)層,這里用的是IP包頭格式
版本:記錄數(shù)據(jù)報(bào)屬于哪一個(gè)版本的協(xié)議,如IPv4或IPv6
首部長度:指明IP頭部長度,單位是字,也就是兩個(gè)字節(jié)。該域的值最小為5,就是標(biāo)準(zhǔn)的頭部長度;最大為15,表明有擴(kuò)展部分。
服務(wù)類型:用來區(qū)分不同服務(wù)的需要
數(shù)據(jù)報(bào)總長:包含IP頭部的數(shù)據(jù)報(bào)的總長度。注意,這里不包括鏈路層的頭部,目前最大值是65535字節(jié)。
分組ID:這個(gè)域的作用是當(dāng)一個(gè)大的數(shù)據(jù)報(bào)被拆分時(shí),拆分成的小的數(shù)據(jù)段的這個(gè)域都是一樣的。
標(biāo)記:共三個(gè)bit,第一個(gè)未使用;第二個(gè)DF(Don’t Fragment),設(shè)置成1表示這個(gè)數(shù)據(jù)包不能被分割,這個(gè)是針對(duì)路由器的一條指令;第三個(gè)MF(MoreFragment),如果一個(gè)數(shù)據(jù)包被分割了,那么除了最后一個(gè)分段以外的所有分段都必須設(shè)置為1,用來表示后面還有更多的分段沒有到達(dá),最后一個(gè)設(shè)置為0,用來表示分割的段全部到達(dá)。
段偏移量:這個(gè)域有13bit,也就是每一個(gè)數(shù)據(jù)報(bào)最多有8192個(gè)分段。每一個(gè)分段的長度必須是8字節(jié)的倍數(shù),也就是說8字節(jié)是分段的基本單位,當(dāng)然分組的最后一個(gè)段不做限制。這樣最大的數(shù)據(jù)報(bào)長度為8*8192=65536字節(jié),比目前限制的最大數(shù)據(jù)報(bào)長度還多1,能夠滿足對(duì)網(wǎng)絡(luò)中所有數(shù)據(jù)報(bào)傳送的需求。
生存時(shí)間:這是一個(gè)生存期計(jì)數(shù)器,最大為255s,但是實(shí)際上使用的時(shí)候用作跳數(shù)計(jì)數(shù)器,當(dāng)值為0時(shí)數(shù)據(jù)報(bào)被丟棄,用來避免一個(gè)數(shù)據(jù)報(bào)過久的逗留在網(wǎng)絡(luò)中。
高層協(xié)議:這里和鏈路層的類型作用相同,用來表示更高層的協(xié)議,這個(gè)數(shù)據(jù)報(bào)里是TCP
首部校驗(yàn)和:IP頭部的校驗(yàn)和
源IP地址:數(shù)據(jù)報(bào)來源主機(jī)的IP地址
目的IP地址:數(shù)據(jù)報(bào)目的主機(jī)的IP地址
紫色部分:傳輸層,這里用的是TCP協(xié)議
源端口號(hào):數(shù)據(jù)報(bào)來源主機(jī)的端口號(hào)
目的端口號(hào):數(shù)據(jù)報(bào)目的主機(jī)的端口號(hào)
注意:源IP地址,目的IP地址,源端口號(hào),目的端口號(hào)這四個(gè)字段唯一的確定了一個(gè)TCP鏈接。
TCP序號(hào)(sq):發(fā)送的TCP的序號(hào),從0開始,實(shí)際中這個(gè)值就是發(fā)送的數(shù)據(jù)報(bào)中內(nèi)容的字節(jié)數(shù),比如我發(fā)送的第一個(gè)報(bào)中sq=0,數(shù)據(jù)報(bào)內(nèi)容20字節(jié),那么下一個(gè)數(shù)據(jù)報(bào)的sq就應(yīng)該是21。
捎帶的確認(rèn)(ack):確認(rèn)收到上一個(gè)數(shù)據(jù)報(bào),然后act的值是指定自己想要收到的下一個(gè)數(shù)據(jù)報(bào)的sq,比如我收到一個(gè)數(shù)據(jù)報(bào)的sq=0,數(shù)據(jù)報(bào)內(nèi)容20字節(jié),那么我的ack就應(yīng)該是21,用來標(biāo)明我sq=0,內(nèi)容為20字節(jié)的數(shù)據(jù)報(bào)已經(jīng)收到,我接下來期望收到的是sq=21的數(shù)據(jù)報(bào)。
首部長度:和IP頭部的長度域類似,這個(gè)域用來標(biāo)明TCP頭部的長度,單位也是字。
保留:6bit未使用的域
Flag:從左到右,[URG|ACK|PSH|RST|SYN|FIN]
ACK?設(shè)置為1表示前面的確認(rèn)(ack)是有效的,否則前面的確認(rèn)應(yīng)被忽略。
PSH?表示要求對(duì)方在接到數(shù)據(jù)后立即請求遞交給應(yīng)用程序,而不是緩沖起來直到緩沖區(qū)收滿為止。
RST?用于重置一個(gè)已經(jīng)混亂的連接。
SYN?用于建立連接的過程。在鏈接請求中,SYN=1和ACK=0表示該數(shù)據(jù)段沒有使用捎帶的確認(rèn)域。鏈接應(yīng)答則捎帶了一個(gè)確認(rèn),即SYN=1和ACK=1.本質(zhì)上SYN位是用來表示CONNECTION?REQUEST和CONNECTION ACCEPTED,然后進(jìn)一步用ACK來區(qū)分是請求還是應(yīng)答,的確很高明。
FIN?用來釋放一個(gè)連接。它表示發(fā)送方已經(jīng)沒有數(shù)據(jù)要傳輸了。然后,在關(guān)閉一個(gè)連接后,關(guān)閉進(jìn)程可能會(huì)在一段不確定的時(shí)間內(nèi)繼續(xù)接收到數(shù)據(jù)。SYN和FIN數(shù)據(jù)段都有TCP序號(hào),從而保證了這兩種數(shù)據(jù)段被按照正確的順序來進(jìn)行處理。
窗口大小:指定了從被確認(rèn)的字節(jié)算起可以發(fā)送多少個(gè)字節(jié)。要深入理解這個(gè)域的含義,可以參看TCP用色控制和慢啟動(dòng)算法
http://blog.csdn.net/alexander_xfl/article/details/13170371
校驗(yàn)和:校驗(yàn)范圍包括TCP頭、數(shù)據(jù)報(bào)內(nèi)容和概念性偽頭部。概念性偽頭部又包括源IP,目的IP,TCP協(xié)議號(hào)。
緊急指針:指向數(shù)據(jù)報(bào)中緊急數(shù)據(jù)最后一個(gè)字節(jié)的下一個(gè)字節(jié)。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的Linux 系统应用编程——网络编程(TCP/IP 数据包格式解析)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2022年五一数学建模竞赛C题
- 下一篇: Linux 系统应用编程——线程基础