嵌入式linux网络编程,TCP、IP协议原理,wireshark抓包工具,以太网头(Etherne

2019-07-12 20:18发布

文章目录

1,wireshark抓包工具

1.1,wireshark安装

linux@linux:~$ sudo apt-get install wireshark

1.2,wireshark启动

linux@linux:~$ 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,解决方案

linux@linux:~$ 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头

在这里插入图片描述