TCP/IP协议栈 --- 网络层(IP 首部 和分片)
IP 是TCP/IP协议栈中重要的层次, TCP UDP ICMP IGMP都是依赖IP层进行传输的。首先它是一种不可靠,无连接的协议。不可靠:它不保证IP包能正确到达目的地,无连接:表示IP并不会维护后续数据包的信息,每个数据包的传输都是独立的。数据包的可靠性需要依赖传输层协议来保证如TCP协议,也就是说当一个比特流从网络接口发送向网络之后,所经过的每个路由器会解析数据包的网络层的信息,再通过路由算法选一条路发送出去,所有包不一定会选择同一条道路。网络层负责点到点的通信,尽量将数据包发送到目的主机,若不能到达目的主机IP有一个简单的错误处理算法:丢弃该数据报,然后发送 ICMP消息报给信源端。
IP首部信息:
如果没有IP选项的话IP首部应该是20字节。用wireshark抓包分析一下
4位版本号: 0100 表示IPv4 若是IPv6的话应该是0110
4位首部长度:0101 表示20个字节,这是因为首部长度指的是首部占 32 bit字的数目,包括任何选项。由于它是一个 4比特字段,因此首部最长为6 0个字节。也就是说这四个比特一个比特表示4个字节。
8位服务类型:服务类型(TO S)字段包括一个3 bit的优先权子字段(现在已被忽略) ,4 bit的TOS子字段和1 bit未用位但必须置0。4 bit的TOS分别代表:最小时延、最大吞吐量、最高可靠性和最小费用。普通数据包里一般都为0x00. 对于不同应用可能会选择不同的TOS。如TFTP telnet等。
16位总长度:表明IP数据包的总长度 最大65535个字节, 但考虑到链路层的MTU 一般这个值要小于1500。拿这个总长度减去IP首部长度就是TCP UDP 等数据包长度。
接下来的4个字节就是表示IP分片的记录信息:
前两个字节表示:那个数据包的分片,标识同一个数据报分片
3位标志表示:是否有更多分片,最后一个IP分片里都为0表示没有分片了
13位片偏移:分片在原始数据的偏移量。
另外在分片过程中传输层信息只会出现在第一个分片中。IP层不知道也不需要保证在每个分片中都有传输层首部。到达目的主机时IP层会把这些IP片组合起来。若有片丢失的话,就会重传整个数据报。组合起来的数据报再交给传输层解析。
最后的几个字节包含目的IP源IP和IP选项(若有)。
下面做一个UDP传输实例看一下IP层分片。
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#define PORT 4444
int main(int argc, char *argv[])
{
if(argc != 2)
{
printf("./udpclient IP\n");
return 1;
}
int fd = socket(AF_INET, SOCK_DGRAM, 0);
if (fd < 0)
return 1;
struct sockaddr_in server;
server.sin_family = AF_INET;
server.sin_port = htons(PORT);
if (!inet_pton(AF_INET, argv[1], (void *)&server.sin_addr))
{
printf("IP error\n");
return -1;
}
char buff1[65535] = "sdfsdfsdf";
char buff2[2048] = {0};
socklen_t size = sizeof(struct sockaddr);
while(1)
{
sendto(fd, buff1, 65535, 0, (const struct sockaddr *)&server, size);
sleep(5);
recvfrom(fd, buff2, 2048, 0, NULL, NULL);
printf("recv : %s\n", buff2);
}
}
服务器端
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#define PORT 4444
int main()
{
int fd = socket(AF_INET, SOCK_DGRAM, 0);
if(fd < 0)
return -1;
struct sockaddr_in server, client;
server.sin_family = AF_INET;
server.sin_port = htons(PORT);
server.sin_addr.s_addr = htonl(INADDR_ANY);
bind(fd, (const struct sockaddr *)&server, sizeof(struct sockaddr));
socklen_t len = sizeof(struct sockaddr);
char buff[2048] = {0};
while(1)
{
recvfrom(fd, buff, 2048, 0,(struct sockaddr *)&client, &len);
printf("%s send msg: %s \n", inet_ntoa(client.sin_addr), buff);
sendto(fd, "OK", 2, 0, (const struct sockaddr *)&client, len);
}
}
抓包结果可以看到:
~# tcpdump -i eth0 -v udp and host 192.168.1.3
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
18:21:40.171370 IP (tos 0x0, ttl 64, id 39920, offset 0, flags [+], proto UDP (17), length 1500)
192.168.1.3.39170 > 192.168.1.4.4444: UDP, length 2048
18:21:40.171385 IP (tos 0x0, ttl 64, id 39920, offset 1480, flags [none], proto UDP (17), length 596)
这里可以看到被分成的两个组,2096 - 2048 = 48字节: 多出的48个字节包含俩个IP头40 + 一个UDP头8 字节??
TCP/IP协议栈 --- 网络层(IP 首部 和分片)的更多相关文章
- 浅谈TCP IP协议栈(四)IP协议解析
通过之前的网络层基础知识,IP地址以及路由器的简介,大家应该对于TCP/IP有一个大致的了解,在脑海里应该对于网络的几个基础概念有个大概的了解,简单点说整个协议栈就是在做一件事,规定网络报文(网络传输 ...
- 浅谈TCP IP协议栈(二)IP地址
上一节大致了解TCP/IP协议栈是个啥东西,依旧是雾里看花的状态,有很多时候学一门新知识时,开头总是很急躁,无从下手,刚学会一点儿,却发现连点皮毛都不算,成就感太低,所以任何时候学习最重要的是要在合适 ...
- 浅谈TCP IP协议栈(三)路由器简介
读完这个系列的第一篇浅谈TCP/IP协议栈(一)入门知识和第二篇浅谈TCP/IP协议栈(二)IP地址,在第一篇中,可能我对协议栈中这个栈的解释有问题,栈在数据结构中是一种先进后出的常见结构,而在整个T ...
- 几个主流TCP/IP协议栈介绍
我们知道TCP IP协议栈内包括了诸多协议.那么对于这当中的协议的功能以及作用,我们来具体了解一下吧.现在让我们做一个盘点,帮助大家总结一下,还望对大家能够有所帮助. 1.BSD TCP IP协议栈 ...
- 结合Wireshark捕获分组深入理解TCP/IP协议之IP协议
摘要: 本文简单介绍了网络层理论知识,详细讲解了IP数据报各个字段,并从Wireshark俘获分组中选取IP数据报进行分析,也阐述了分组和分片的区别. 一.IPv4数据报 网络层是 ...
- 【转】TCP/IP协议栈及OSI参考模型详解
OSI参考模型 OSI RM:开放系统互连参考模型(open systeminterconnection reference model) OSI参考模型具有以下优点: 简化了相关的网络操作: 提供设 ...
- TCP/IP协议栈及OSI参考模型详解
OSI参考模型 OSI RM:开放系统互连参考模型(open systeminterconnection reference model) OSI参考模型具有以下优点: 简化了相关的网络操作: 提供设 ...
- TCP/IP协议栈模型
OSI七层模型介绍: 下面4层(物理层.数据链路层.网络层和传输层)主要提供数据传输和交换功能,即以节点到节点之间的通信为主:第4层作为上下两部分的桥梁,是整个网络体系结构中最关键的部分:而上3层(会 ...
- linux OSI七层模型、TCP/IP协议栈及每层结构大揭秘
学习Linux,就算是像小编我这样的小萌新,也知道OSI模型.什么?!你不知道!!! 好吧,这篇秘籍拿走,不谢~~~ 一.两个协议 (1)OSI 协议模型(7层)国际协议 PDU:协议数据单元对 ...
随机推荐
- Spring源码情操陶冶-AOP之Advice通知类解析与使用
阅读本文请先稍微浏览下上篇文章Spring源码情操陶冶-AOP之ConfigBeanDefinitionParser解析器,本文则对aop模式的通知类作简单的分析 入口 根据前文讲解,我们知道通知类的 ...
- input输入框校验,字母,汉字,数字等
<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta http-e ...
- 【HDFS】相关概念及常用命令
本文用于记录Hadoop中HDFS相关概念以及常用命令,以便日后查询. 概念之间无先后顺序,只是用于记录. 参考的Hadoop的版本是2.7.3 1. 角色 hadoop fs [hdfs dfs] ...
- iOS之 Auto Layout
1. 动画 // 修改从 StoryBoard 绑定到类的约束的值 self.boxView.constant += 80 // 在动画闭包里对其父级进行 layoutIfNeeded() UIVie ...
- Bluetooth Obex
OPP 1.2 which uses OBEX over L2CAP. OPP 1.1 connection and transfer happens over RFCOMM->L2CAP.
- RabbitMQ使用详解
刚刚用了,记录下来,以后忘了,方便能够快速想起来. 首先说明,由于RabbitMQ服务端非JAVA,C++语言,当然也就看不懂,所以本文的理解都是过于主观的. 一,RabbitMQ服务端搭建 推荐最好 ...
- 操作系统--进程管理1--单个CPU情况
1.进程概念 进程:一个正在执行的程序:操作系统提出进程概念目的:是为了跟踪程序在执行期间的状态.而程序只是一段代码,是一个静态的概念 无法准确描述程序执行时候发生的一切.程序代码被加载进内存后就以进 ...
- Ajax通过FormData上传文件
1.使用<form>表单初始化FormData对象方式上传文件 HTML代码 <form id="uploadForm" enctype="multip ...
- iOS内置图片瘦身思路整理
一.前言 前段时间注意到我们APP的包大小超过100MB了,所以随口跟老板说了下能否采用字体文件(.ttf)替代PNG图片,老板对应用瘦身很感兴趣因此让我做下技术调研.这篇文章主要是将我们的各个技术方 ...
- mapreduce解析执行sql流程
样例准备 编号 姓名 性别 班级编号 1 name_1 male 1 2 name_2 female 2 3 name_3 male 3 4 name_4 female 4 5 name_5 male ...