Socket编程实践(16) --TCP/IP各层报文(1)

以太网帧格式

说明1:链路层的数据包,称为以太网帧。

说明2:链路层不识别IP地址[因为IP地址是逻辑地址],链路层识别物理网卡MAC地址[硬件地址]。

说明3:需要根据IP地址找到对方的MAC地址(ARP地址解析协议)[MAC —> IP地址方向地址解析:RARP反向地址解析协议]。

说明4:应用层根据对等方的IP地址进行通讯,在数据封装过程中,链路层需要目的地址的MAC地址从何而来?需要将IP地址转换成MAC地址,也就是地址解析。

以太网首部代码:

struct ethernet_hdr
{
    char dest_mac[6];
    char src_mac[6];
    short protocol;
};

ARP地址解析协议

ARP首部代码:

struct arp_hdr
{
    unsigned short hwtype;	// 固定1
    unsigned short protype;	// 固定0x0800(代表为IP协议做请求)
    unsigned char hwaddrlen;	// 固定6(即MAC地址长度)
    unsigned char proaddrlen;	// 固定4 (即IP地址长度)
    unsigned short opcode;	// Request - 1, Reply - 0x0002
    unsigned char sender_mac[6];	// 发送者MAC
    unsigned char sender_ip[4];	// 发送者IP
    unsigned char dest_mac[6];	// 接收者MAC
    unsigned char dest_ip[4];	// 接收者IP
};

以太网的MTU和路径MTU

以太网和IEEE 802.3对数据帧的长度都有限制,其最大值分别是1500和1492字节,将这个限制称作最大传输单元(MTU,Maximum Transmission Unit)

如果IP层有一个数据报要传,而且数据的长度比链路层的MTU还大,那么IP层就要进行分片(Fragmentation),把数据报分成若干片,这样每一片都小于MTU。

当网络上的两台主机互相进行通信时,两台主机之间要经过多个网络,每个网络的链路层可能有不同的MTU,其中两台通信主机路径中的最小MTU被称作路径MTU。

IP数据报

版本号,目前取值4

首部长度,4个字节为单位,取值范围5~15

服务类型,指定传输的优先级、传输速度、可靠性和吞吐量等

报文总长度,最大长度为65535字节

报文标识,唯一标识一个数据报,如果数据报分段,则每个分段的标识都一样

标志,最高位未使用,定义为0,其余两位为DF(不分段)和MF(更多分段)

段偏移量,以8个字节为单位,指出该分段的第一个数据字在原始数据报中的偏移位置

生存时间(TTL),取值0~255,每经过一个路由节点减1,为0时被丢弃(Tranceroute程序的实现原理)

协议,指明该数据报的协议类型,如1为ICMP,4为IP,6为TCP,17为UDP等

首部校验和,每通过一次网关都要重新计算该值,用于保证IP首部的完整性

选项,长度可变,提供某些场合下需要的控制功能,IP首部的长度必须是4个字节的整数倍,如果选项长度不是4的整数倍,必须填充数据

IP首部代码:

struct ip_hdr
{
    char  ver_hl;
    char  tos;
    unsigned short len;
    unsigned short id;
    unsigned short fragment;
    char ttl;
    char protocol;
    unsigned short hdr_chksum;
    char src_ip [4];
    char dest_ip [4];
};

ICMP协议

ICMP协议用于传递差错信息、时间、回显、网络信息等控制数据

当我们ping 一台主机想看它是否运行时,就产生了一条ICMP 信息。远程主机将用它自己的ICMP 信息对ping 请求作出回应。

ICMP协议说明:

本身是IP的一部分。

用途:网关或者目标机器利用ICMP与源通讯,当出现问题时,提供反馈信息

在IP协议栈中必须实现

ICMP包含在IP数据包的净荷数据中,IP头中协议类型为1

ICMP数据的第一个字节代表ICMP报文的类型,它决定了后续数据的格式

特点:

其控制能力并不用于保证传输的可靠性

它本身也不是可靠传输的

ICMP数据包

ICMP包含在IP数据包的净荷数据中,IP头中协议类型为1

ICMP数据的第一个字节代表ICMP报文的类型,它决定了后续数据的格式

ICMP首部代码:

struct icmp_hdr
{
    char	type;			// ICMP报文类型
    char 	code;			// “子类型”
    unsigned short  icmpchksum;	// 校验和
};

ICMP报文类型

报文类型说明

2 0 Echo Reply

2 3 Destination Unreachable

2 4 Source Quench

2 5 Redirect

2 8 Echo

2 11 Time Exceeded

2 12 Parameter Problem

2 13 Timestamp

2 14 Timestamp Reply

2 15 Information Request

2 16 Information Reply

2 17 Address Mask Request

2 18 Address Mask Reply

报文分类

2 ICMP差错报文

2 目的不可达报文(类型3)

2 超时报文(类型11)

2 参数出错报文(类型12)

2 ICMP控制报文

2 报源抑制报文(类型4)

2 重定向(类型5)

2 ICMP请求/应答报文

2 回送请求和响应报文(类型0和8)

2 时间戳请求和响应报文(类型13和14)

2 地址掩码请求和响应报文(类型17和18)

2 其他

ICMP Echo报文

类型:0表示Echo Reply,8表示Echo

代码:0

标识符:标识一个会话,例如,用进程ID

序号:例如每个请求增1

选项数据:回显

ICMP 目的不可达报文

类型:3

代码:0表示网络不可达,1表示主机不可达;2表示协议不可达;3表示端口不可达;等等

出错的IP包的IP首部+原始IP数据包中前8个字节

时间: 2024-08-23 10:44:17

Socket编程实践(16) --TCP/IP各层报文(1)的相关文章

Socket编程实践(17) --TCP/IP各层报文(2)

UDP数据报 UDP首部代码: struct udp_hdr { unsigned short src_port; unsigned short dest_port; unsigned short len; unsigned short chksum; }; TCP报文段 协议描述 源端口号和目的端口号:源和目的主机的IP地址加上端口号构成一个TCP连接 序号和确认号:序号为该TCP数据包的第一个数据字在所发送的数据流中的偏移量:确认号为希望接收的下一个数据字的序号: 首部长度,以4个字节为单位

Socket编程实践(1) --TCP/IP简述

ISO的OSI OSI(open system interconnection)开放系统互联模型是由ISO国际标准化组织定义的网络分层模型,共七层, 从下往上为: OSI七层参考模型 物理层(Physical Layer) 物理层定义了所有电子及物理设备的规范,为上层的传输提供了一个物理介质,本层中数据传输的单位为比特(bit/二进制位).属于本层定义的规范有EIA/TIA RS-232.RJ-45等,实际使用中的设备如网卡属于本层. 数据链路层(Data Link Layer) 对物理层收到的

Socket编程实践(6) --TCP服务端注意事项

僵尸进程处理 1)通过忽略SIGCHLD信号,避免僵尸进程 在server端代码中添加 signal(SIGCHLD, SIG_IGN); 2)通过wait/waitpid方法,解决僵尸进程 signal(SIGCHLD,onSignalCatch); void onSignalCatch(int signalNumber) { wait(NULL); } 3) 如果多个客户端同时关闭, 问题描述如下面两幅图所示: /** client端实现的测试代码**/ int main() { int s

Socket编程实践(6) --TCP粘包原因与解决

流协议与粘包 粘包的表现 Host A 发送数据给 Host B; 而Host B 接收数据的方式不确定 粘包产生的原因 说明 TCP 字节流,无边界 对等方,一次读操作,不能保证完全把消息读完 UDP 数据报,有边界 对方接受数据包的个数是不确定的 产生粘包问题的原因分析 1.SQ_SNDBUF 套接字本身有缓冲区 (发送缓冲区.接受缓冲区) 2.tcp传送的端 mss大小限制 3.链路层也有MTU大小限制,如果数据包大于>MTU要在IP层进行分片,导致消息分割. 4.tcp的流量控制和拥塞控

Socket编程实践(9) --TCP服务器常见问题(4)

TCP/IP协议的11种状态 说明: 1.如下图(客户端与服务器都在本机:双方(server的子进程,与client)链接已经建立(ESTABLISHED),等待通信) 2.最先调用close的一端,后面会进入TIME_WAIT的状态(下图,server端首先关闭) 3.TIME_WAIT 时间是2MSL(报文的最长存活周期的2倍)     原因:(ACK y+1)如果发送失败可以重发. 服务器端处于closed状态,不等于客户端也处于closed状态.. 4.TCP/IP协议的第1种状态:图上

Socket编程实践(5) --TCP粘包问题与解决

TCP粘包问题 因为TCP协议是基于字节流且无边界的传输协议, 因此非常有可能产生粘包问题, 问题描写叙述例如以下 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvempmMjgwNDQxNTg5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" /> 对于Host A 发送的M1与M2两个各10K的数据块, Host B 接收数据的方式不确定, 有以下

Linux程序设计学习笔记----Socket网络编程基础之TCP/IP协议簇

转载请注明出处: ,谢谢! 内容提要 本节主要学习网络通信基础,主要涉及的内容是: TCP/IP协议簇基础:两个模型 IPv4协议基础:IP地址分类与表示,子网掩码等 IP地址转换:点分十进制\二进制 TCP/IP协议簇基础 OSI模型 我们知道计算机网络之中,有各种各样的设备,那么如何实现这些设备的通信呢? 显然是通过标准的通讯协议,但是,整个网络连接的过程相当复杂,包括硬件.软件数据封包与应用程序的互相链接等等,如果想要写一支将联网全部功能都串连在一块的程序,那么当某个小环节出现问题时,整只

(转)iOS 各种网络编程总结--进程、线程、Socket、HTTP、TCP/IP、TCP和UDP

######################################################### 进程与线程 进程和线程都是由操作系统分配和调度的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性. 进程是一块包含了某些资源的内存区域.操作系统利用进程把它的工作划分为一些功能单元.进程中所包含的一个或多个执行单元称为线程(thread).进程还拥有一个私有的虚拟地址空间,该空间仅能被它所包含的线程访问. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更

Linux下socket编程,附带tcp例子

1.网络中进程之间如何通信? 本地的进程间通信(IPC)有很多种方式,但可以总结为下面4类: 消息传递(管道.FIFO.消息队列) 同步(互斥量.条件变量.读写锁.文件和写记录锁.信号量) 共享内存(匿名的和具名的) 远程过程调用(Solaris门和Sun RPC) 但这些都不是本文的主题!我们要讨论的是网络中进程之间如何通信?首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的.其实TCP/IP协议族已经帮我们解决了这个问