嵌入式linux網路程式設計,TCP、IP協議原理,wireshark抓包工具,乙太網頭(Ethernet header),IP頭,TCP頭,三次握手,四次握手,UDP頭
文章目錄
- 1,wireshark抓包工具
- 2,常用除錯測試工具
- 3,TCP/IP協議網路封包格式
- 3.1,乙太網頭(Ethernet header)--- (網路介面和物理層)
- 3.2,IP頭 --- (網路層)
- 3.2.1. Version:
- 3.2.2. IHL(Head Length):
- 3.2.3. Type of Service(TOS):
- 3.2.4. Total Length:
- 3.2.5. Identification:
- 3.2.6. IP Flags:
- 3.2.7. Fragment Offset:
- 3.2.8. Time To Live(TTL):
- 3.2.9. Protocol:
- 3.2.10. Header Checksum:
- 3.2.11. Source and Destination Addresses:
- 3.2.12. Options:
- 3.2.13,IP頭結構體
- 3.3,TCP頭 --- (傳輸層)
- 3.3.1 Source Port:
- 3.3.2 Destination Port:
- 3.3.3 Sequence Number:
- 3.3.4 Acknowledgment Number:
- 3.3.5 Offset:
- 3.3.6 Reserved:
- 3.3.7 TCP Flags:
- 3.3.7 Window:
- 3.3.7 Checksum:
- 3.3.7 Urgent Pointer:
- 3.3.7 TCP Opyions:
- 3.4 三次握手,四次握手
- 4,UDP頭
1,wireshark抓包工具
1.1,wireshark安裝
[email protected]:~$ sudo apt-get install wireshark
1.2,wireshark啟動
[email protected]:~$ sudo wireshark
1.2.1,出現錯誤警告
Lua: Error during loading:
/usr/share/wireshark/init.lua:32: dofile has been disabled due to running Wireshark as superuser. See https://wiki.wireshark.org/CaptureSetup/CapturePrivileges for help in running Wireshark as an unprivileged user.
1.2.2,解決方案
[email protected]:~$ sudo gedit /usr/share/wireshark/init.lua
將倒數第二行dofile(DATA_DIR…“console.lua”)
改為–dofile(DATA_DIR…“console.lua”)
2,常用除錯測試工具
使用telnet測試TCP伺服器端
使用lsof
使用tcpdump
使用netstat
使用sniffer
使用wireshark
Chariot
…
SmartBit—硬體
3,TCP/IP協議網路封包格式
3.1,乙太網頭(Ethernet header)— (網路介面和物理層)
3.1.1. Destination MAC Address:
目的MAC地址(物理層面)
3.1.2. Source MAC Address:
源MAC地址(物理層面)
3.1.3. EtherType:
包型別
·ARP地址解析協議
·RARP逆向地址解析協議
3.2,IP頭 — (網路層)
3.2.1. Version:
IP版本
·0100(IPv4)
·0110(IPv6)
3.2.2. IHL(Head Length):
IP頭長度(一般為20個位元組,可以用於指示IP Option有多少內容)
3.2.3. Type of Service(TOS):
服務型別(網路應用商設定的許可權,定義包的優先順序,取值越大資料越重要)
8位 按位被如下定義 PPP DTRC0
PPP
·000 普通 (Routine)
·001 優先的 (Priority)
·010 立即的傳送 (Immediate)
·011 閃電式的 (Flash)
·100 比閃電還閃電式的 (Flash Override)
·101 CRI/TIC/ECP(找不到這個詞的翻譯)
·110 網間控制 (Internetwork Control)
·111 網路控制 (Network Control)
DTRC0
·D 時延: 0:普通 1:延遲儘量小
·T 吞吐量: 0:普通 1:流量儘量大
·R 可靠性: 0:普通 1:可靠性儘量大
·M 傳輸成本: 0:普通 1:成本儘量小
·0 最後一位被保留,恆定為0
3.2.4. Total Length:
IP包的總長度(包括頭部和資料)(兩個位元組,最大64KB)
3.2.5. Identification:
識別符號,長度16位元。該欄位和IP Flags和Fragment Offest欄位聯合使用,對較大的上層資料包進行分段(fragment)操作。路由器將一個包拆分後,所有拆分開的小包被標記相同的值,以便目的端裝置能夠區分哪個包屬於被拆分開的包的一部分。
3.2.6. IP Flags:
標記,長度3位元。
·該欄位第一位不使用。
·第二位是DF(Don’t Fragment)位,DF位設為1時表明路由器不能對該上層資料包分段。如果一個上層資料包無法在不分段的情況下進行轉發,則路由器會丟棄該上層資料包並返回一個錯誤資訊。
·第三位是MF(More Fragments)位,當路由器對一個上層資料包分段,則路由器會在除了最後一個分段的IP包的包頭中將MF位設為1。第三位是MF(More Fragments)位,當路由器對一個上層資料包分段,則路由器會在除了最後一個分段的IP包的包頭中將MF位設為1。
3.2.7. Fragment Offset:
片偏移,長度13位元。表示該IP包在該組分片包中位置,接收端靠此來組裝還原IP包。
3.2.8. Time To Live(TTL):
生存時間,長度8位元。當IP包進行傳送時,先會對該欄位賦予某個特定的值。當IP包經過每一個沿途的路由器的時候,每個沿途的路由器會將IP包的TTL值減少1。如果TTL減少為0,則該IP包會被丟棄。這個欄位可以防止由於路由環路而導致IP包在網路中不停被轉發。
3.2.9. Protocol:
協議,長度8位元。標識了上層所使用的協議。
以下是比較常用的協議號:
1 ICMP
2 IGMP
6 TCP
17 UDP
88 IGRP
89 OSPF
3.2.10. Header Checksum:
頭部校驗,長度16位。用來做IP頭部的正確性檢測,但不包含資料部分。 因為每個路由器要改變TTL的值,所以路由器會為每個通過的資料包重新計算這個值。
3.2.11. Source and Destination Addresses:
起源和目標地址,這兩個地段都是32位元。標識了這個IP包的起源和目標地址。要注意除非使用NAT,否則整個傳輸的過程中,這兩個地址不會改變。
至此,IP包頭基本的20位元組已介紹完畢,此後部分屬於可選項,不是必須的部分。
3.2.12. Options:
可選項,這是一個可變長的欄位。該欄位屬於可選項,主要用於測試,由起源裝置根據需要改寫。可選專案包含以下內容:
·鬆散源路由(Loose source routing):給出一連串路由器介面的IP地址。IP包必須沿著這些IP地址傳送,但是允許在相繼的兩個IP地址之間跳過多個路由器。
·嚴格源路由(Strict source routing):給出一連串路由器介面的IP地址。IP包必須沿著這些IP地址傳送,如果下一跳不在IP地址表中則表示發生錯誤。
·路由記錄(Record route):當IP包離開每個路由器的時候記錄路由器的出站介面的IP地址。
·時間戳(Timestamps):當IP包離開每個路由器的時候記錄時間。
·填充(Padding):因為IP包頭長度(Header Length)部分的單位為32bit,所以IP包頭的長度必須為32bit的整數倍。因此,在可選項後面,IP協議會填充若干個0,以達到32bit的整數倍。
3.2.13,IP頭結構體
typedef struct _iphdr //定義IP首部
{
unsigned char h_lenver; //4位首部長度+4位IP版本號
unsigned char tos; //8位服務型別TOS
unsigned short total_len; //16位總長度(位元組)
unsigned short ident; //16位標識
unsigned short frag_and_flags; //3位標誌位
unsigned char ttl; //8位生存時間 TTL
unsigned char proto; //8位協議 (TCP, UDP 或其他)
unsigned short checksum; //16位IP首部校驗和
unsigned int sourceIP; //32位源IP地址
unsigned int destIP; //32位目的IP地址
}IP_HEADER;
3.3,TCP頭 — (傳輸層)
- TCP是一種面向連線的,可靠的資料傳輸
3.3.1 Source Port:
源埠
3.3.2 Destination Port:
目的埠
3.3.3 Sequence Number:
序列號:TCP把所有要傳送的資料進行編號(每個位元組用一個號)
3.3.4 Acknowledgment Number:
確認序列號
TCP的可靠傳輸:通過確認和重發機制實現可靠傳輸
TCP把所有要傳送的資料進行編號(每個位元組用一個號)
傳送時從當前位置傳送Window大小的資料
3.3.5 Offset:
偏移:除掉TCP頭(預設20位元組,有可選項的就不止20位元組)之後資料起始位置
3.3.6 Reserved:
保留
3.3.7 TCP Flags:
標識
3.3.7 Window:
資料窗
3.3.7 Checksum:
16位CRC
3.3.7 Urgent Pointer:
緊急指標(和OOB帶外資料有關)
3.3.7 TCP Opyions:
3.4 三次握手,四次握手
TCP提供可靠傳輸的工作原理和實現過程:https://blog.csdn.net/guoweimelon/article/details/50878503
- 1、2、3是三次握手
TCP三次握手建立連線:https://blog.csdn.net/guoweimelon/article/details/50878730
·由客戶端發起 - 4、5、6、7是資料傳輸
- [8、]9、10、11是四次握手
TCP四次握手釋放連線:https://blog.csdn.net/guoweimelon/article/details/50879302
·客戶端和伺服器都可以發起
4,UDP頭