1. 程式人生 > >嵌入式linux網路程式設計,TCP、IP協議原理,wireshark抓包工具,乙太網頭(Ethernet header),IP頭,TCP頭,三次握手,四次握手,UDP頭

嵌入式linux網路程式設計,TCP、IP協議原理,wireshark抓包工具,乙太網頭(Ethernet header),IP頭,TCP頭,三次握手,四次握手,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. 1、2、3是三次握手
    TCP三次握手建立連線:https://blog.csdn.net/guoweimelon/article/details/50878730
    ·由客戶端發起
  2. 4、5、6、7是資料傳輸
  3. [8、]9、10、11是四次握手
    TCP四次握手釋放連線:https://blog.csdn.net/guoweimelon/article/details/50879302
    ·客戶端和伺服器都可以發起

在這裡插入圖片描述

在這裡插入圖片描述

4,UDP頭

在這裡插入圖片描述