网络基础3-1(细谈IP协议头, 网络层,子网划分,路由选择,数据链路层,以太网帧格式,MAC地址,再谈ARP协议)

IP协议

IP协议头格式

在这里插入图片描述

  1. 4位版本号(version): 指定IP协议的版本, 对于IPv4来说, 就是4
  2. 4位头部长度(header length): IP头部的长度是多少个。32bit, 也就是 length * 4 的字节数. 4bit表示大 的数字是15, 因此IP头部大长度是60字节
  3. 8位服务类型(Type Of Service): 3位优先权字段(已经弃用), 4位TOS字段, 和1位保留字段(必须置为0). 4位 TOS分别表示: 最小延时, 大吞吐量, 高可靠性, 小成本. 这四者相互冲突, 只能选择一个. 对于 ssh/telnet这样的应用程序, 小延时比较重要; 对于ftp这样的程序, 大吞吐量比较重要.
  4. 16位总长度(total length): IP数据报整体占多少个字节. 64K
  5. 16位标识(id): 唯一的标识主机发送的报文. 如果IP报文在数据链路层被分片了, 那么每一个片里面的这个 id都是相同的.
  6. 3位标志字段: 第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要用到). 第二位置为1表示禁 止分片, 这时候如果报文长度超过MTU, IP模块就会丢弃报文. 第三位表示"更多分片", 如果分片了的话, 后一个分片置为1, 其他是0. 类似于一个结束标记
  7. 13位分片偏移(framegament offset): 是分片相对于原始IP报文开始处的偏移. 其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移的字节数是这个值 * 8 得到的. 因此, 除了后一个报文之外, 其他报 文的长度必须是8的整数倍(否则报文就不连续了).
  8. 8位生存时间(Time To Live, TTL): 数据报到达目的地的大报文跳数. 一般是64. 每次经过一个路由, TTL -= 1, 一直减到0还没到达, 那么就丢弃了. 这个字段主要是用来防止出现路由循环
  9. 8位协议: 表示上层协议的类型
  10. 16位头部校验和: 使用CRC进行校验, 来鉴别头部是否损坏.
  11. 32位源地址和32位目标地址: 表示发送端和接收端.
  12. 选项字段(不定长, 多40字节): 略

网络层

功能:地址管理与路由选择

路由选择

在复杂的网络传输中对数据的传输选择一条合适路径

IP地址不能随意分配,因为随意分配就有很大概率造成IP地址冲突(数据无法发送)
解决方法:将IP地址的分配规范起来
每个路由器都能够组建一个局域网,这个局域网就应该具有自己的网络标识(网络号),这个路由器向自己组建的局域网中的主机分配的IP地址都应该包含这个网络标识
同时为了在局域网中,能够唯一标识一个主机,IP地址中还应该包含主机标识(主机号)
IP地址的组成:网络号+主机号
IP地址的分配规范起来后,只需要对网络号的取值进行规范就可以了,相邻的网络不能具备相同的网络号
一个路由器上相连的所有网络网络号不能相同,因为这些网络都属于相邻网络,数据到了路由器上之后,一旦网络号冲突就会导致路由器不知道数据该给谁

网段的划分

IP地址分为两个部分, 网络号和主机号

  1. 网络号: 保证相互连接的两个网段具有不同的标识;
  2. 主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号;

早期将IP地址划分为五类

  1. A类 0.0.0.0到127.255.255.255
  2. B类 128.0.0.0到191.255.255.255
  3. C类 192.0.0.0到223.255.255.255
  4. D类 224.0.0.0到239.255.255.255
  5. E类 240.0.0.0到247.255.255.255

随着Internet的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请B类网络地址, 导致B类地址很快就 分配完了, 而A类却浪费了大量地址;

  1. 例如, 申请了一个B类地址, 理论上一个子网内能允许6万5千多个主机. A类地址的子网内的主机数更多.
  2. 然而实际网络架设中, 不会存在一个子网内有这么多的情况. 因此大量的IP地址都被浪费掉了.

现在的网段划分

CIDR(Classless Interdomain Routing):
  1. 引入一个额外的子网掩码(subnet mask)来区分网络号和主机号;
  2. 子网掩码也是一个32位的正整数. 通常用一串 “0” 来结尾;
  3. 将IP地址和子网掩码进行 “按位与” 操作, 得到的结果就是网络号;
  4. 网络号和主机号的划分与这个IP地址是A类、B类还是C类无关;

示例

有一个网络ip:192.168.122.132,netmask:255.255.255.0;现在要将这个网络平均划分为四个子网,请问每个子网ip地址范围以及子网掩码
解:

	通过ip地址和子网掩码得到的原网络的主机号个数:256通过ip地址和子网掩码得到原网络的网络号192.168.122.0平均划分四个子网,则每个子网主机号个数64个;0~63 就是00111111按位取反子网掩码 = 255.255.255.192192.168.122.0 ~ 192.168.122.63   255.255.255.192192.168.122.64 ~ 192.168.122.127 192.168.122.128 ~ 192.168.122.191192.168.122.192 ~ 192.168.122.255

注意事项

  1. 相邻的网络不能具有相同的网络号
  2. RFC1918规定,能够用于组建私网的网段,只有以下几种网段:
10.*.*.*   172.16.*.* ~ 172.31.*.*  192.168.*.*

特殊的ip地址

  1. 主机号全为1的IP地址:192.168.122.132 255.255.255.0 局域网的udp广播地址 例如:192.168.122.255
  2. 主机号全为0的IP地址:网络号—标识一个网络 例如:192.168.122.0
  3. 每一个局域网中,这两个主机号是不能分配给主机的,意味着主机号虽然有256个,但是能够分配给主机的只有254个
  4. 127.0.0.1 本地回环网卡地址----虚拟网卡地址—用于本机内的网络回环测试

注意事项

  1. 一个路由器可以配置两个IP地址, 一个是WAN口IP, 一个是LAN口IP(子网IP).
  2. 路由器LAN口连接的主机, 都从属于当前这个路由器的子网中.
  3. 不同的路由器, 子网IP其实都是一样的(通常都是192.168.1.1). 子网内的主机IP地址不能重复. 但是子网之 间的IP地址就可以重复了
  4. 每一个家用路由器, 其实又作为运营商路由器的子网中的一个节点. 这样的运营商路由器可能会有很多级, 外层的运营商路由器, WAN口IP就是一个公网IP
  5. 子网内的主机需要和外网进行通信时, 路由器将IP首部中的IP地址进行替换(替换成WAN口IP), 这样逐级 替换, 终数据包中的IP地址成为一个公网IP. 这种技术称为NAT(Network Address Translation,网络地址转换).
  6. 如果希望我们自己实现的服务器程序, 能够在公网上被访问到, 就需要把程序部署在一台具有外网IP的服 务器上. 这样的服务器可以在阿里云/腾讯云上进行购买.

路由选择

  1. 当IP数据包, 到达路由器时, 路由器会先查看目的IP;
  2. 路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下一个路由器;
  3. 依次反复, 一直到达目标IP地址
    在这里插入图片描述
    在这里插入图片描述
    那么如何判定当前这个数据包该发送到哪里呢? 这个就依靠每个节点内部维护一个路由表;

路由表

在这里插入图片描述

  1. 路由表可以使用route命令查看
  2. 如果目的IP命中了路由表, 就直接转发即可;
  3. 路由表中的后一行,主要由下一跳地址和发送接口两部分组成,当目的地址与路由表中其它行都不匹配 时,就按缺省路由条目规定的接口发送到下一跳地址

链路层

功能:负责相邻设备结点之间的数据帧传输;eth–以太网协议;交换机

以太网

  1. “以太网” 不是一种具体的网络, 而是一种技术标准; 既包含了数据链路层的内容, 也包含了一些物理层的 内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等;
  2. 例如以太网中的网线必须使用双绞线; 传输速率有10M, 100M, 1000M等;
  3. 以太网是当前应用广泛的局域网技术; 和以太网并列的还有令牌环网, 无线LAN等;

以太网帧格式

在这里插入图片描述

  1. 源地址和目的地址是指网卡的硬件地址(也叫MAC地址), 长度是48位,是在网卡出厂时固化的
  2. 2字节上层协议类型
  3. 帧协议类型字段有三种值,分别对应IP、ARP、RARP
  4. 帧末尾是CRC校验码。

MAC地址:

物理网卡设备的硬件地址 uint8_t mac[6],负责定位相邻的设备

  1. MAC地址用来识别数据链路层中相连的节点;
  2. 长度为48位, 及6个字节. 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)
  3. 在网卡出厂时就确定了, 不能修改. mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址, 可 能会冲突; 也有些网卡支持用户配置mac地址).

MTU–最大传输单元

在这里插入图片描述
MTU相当于发快递时对包裹尺寸的限制. 这个限制是不同的数据链路对应的物理层, 产生的限制.

  1. 以太网帧中的数据长度规定小46字节,大1500字节,ARP数据包的长度不够46字节,要在后面补填充 位;
  2. 大值1500称为以太网的大传输单元(MTU),不同的网络类型有不同的MTU;
  3. 如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分 片(fragmentation);
  4. 不同的数据链路层标准的MTU是不同的;

MTU对IP协议的影响

由于数据链路层MTU的限制, 对于较大的IP数据包要进行分包.

  1. 将较大的IP包分成多个小包, 并给每个小包打上标签
  2. 每个小包IP协议头的 16位标识(id) 都是相同的;
  3. 每个小包的IP协议头的3位标志字段中, 第2位置为0, 表示允许分片, 第3位来表示结束标记(当前是否是 后一个小包, 是的话置为1, 否则置为0);
  4. 到达对端时再将这些小包, 会按顺序重组, 拼装到一起返回给传输层
  5. 一旦这些小包中任意一个小包丢失, 接收端的重组就会失败. 但是IP层不会负责重新传输数据

MTU对UDP协议的影响

  1. 一旦UDP携带的数据超过1472(1500 - 20(IP首部) - 8(UDP首部)), 那么就会在网络层分成多个IP数据报.
  2. 这多个IP数据报有任意一个丢失, 都会引起接收端网络层重组失败. 那么这就意味着, 如果UDP数据报在 网络层被分片, 整个数据被丢失的概率就大大增加了
  3. udp传输过程中,任意一个分片出问题,整个数据包都会被丢弃,分片越多,危险越高
  4. 因此udp数据包在应用层都需要由用户根据mss分割成合适的大小

一个报文最大大小64K包含ip头部 udp头部数据大小不能超过64K - 20 - 8

udp数据大小 mtu < size < 64K - 20 - 8 就会在网络层进行数据分片,到了对端就会进行分片重组
在这里插入图片描述

MTU对TCP协议的影响

  1. TCP的一个数据报也不能无限大, 还是受制于MTU. TCP的单个数据报的大消息长度, 称为MSS(Max Segment Size);
  2. TCP在建立连接的过程中, 通信双方会进行MSS协商
  3. 理想的情况下, MSS的值正好是在IP不会被分片处理的大长度(这个长度仍然是受制于数据链路层的 MTU).
  4. 双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值
  5. 然后双方得知对方的MSS值之后, 选择较小的作为终MSS
  6. MSS的值就是在TCP首部的40字节变长选项中(kind=2);
  7. MSS–最大报文段大小—实际的最大数据大小:MTU-IP头部-TCP头部1500 - 20 - 20 = 1460

ARP协议

ARP协议的作用

ARP协议建立了主机 IP地址 和 MAC地址 的映射关系.

  1. 在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址
  2. 数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢 弃;
  3. 因此在通讯前必须获得目的主机的硬件地址;

ARP协议格式在这里插入图片描述

  1. 注意到源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次,对于链路层为以太网的情况 是多余的,但如果链路层是其它类型的网络则有可能是必要的
  2. 硬件类型指链路层网络类型,1为以太网;
  3. 协议类型指要转换的地址类型,0x0800为IP地址;
  4. 硬件地址长度对于以太网地址为6字节
  5. 协议地址长度对于和IP地址为4字节;
  6. op字段为1表示ARP请求,op字段为2表示ARP应答

ARP协议的工作流程

  1. 源主机发出ARP请求,询问“IP地址是192.168.0.1的主机的硬件地址是多少”, 并将这个请求广播到本地网段(以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播);
  2. 目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中
  3. 每台主机都维护一个ARP缓存表,可以用arp -a命令查看。缓存表中的表项有过期时间(一般为20分钟),如 果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址
为什么要有缓存表? 为什么表项要有过期时间而不是一直有效?

在以太局域网内数据包传输依靠的是MAC地址,IP地址与MAC对应的关系依靠ARP表,每台安装有TCP/IP协议的主机(包括网关)都有一个ARP缓存表。该表中保存这网络中各个电脑的IP地址和MAC地址的对照关系。
ip地址动态分配,上一次保存的关系就失效了,所以保存时间不会很长

局域网的ARP攻击

你给我一个请求,我不是你的请求对象,但是我还是给了你的响应信息,然后你就把数据发给我了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/383186.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络中典型协议--(DNS,输入url后, 发生的事情. ,ICMP,NAT)

DNS&#xff08;Domain Name System&#xff09; DNS是一整套从域名映射到IP的系统 域名服务器发展背景 TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序. 但是IP地址不方便记忆. 于是人们发明了一种叫主机名的东西, 是一个字符串, 并且使用hosts文件来描述主机…

高级IO--1 ---(五种典型IO,阻塞IO,非阻塞IO,信号驱动IO,异步IO, IO多路转接)

高级IO&#xff1a; 五种典型IO&#xff1a; 阻塞IO/非阻塞IO/信号驱动IO/异步IO/IO多路转接 IO多路转接模型&#xff1a;select/poll/epoll 五种典型IO 阻塞IO IO操作的流程&#xff1a;等待IO操作条件具备&#xff0c;然后进行数据拷贝 为了完成IO操作发起调用&#xff…

IO多路转接模型----(select的模型,select的优缺点,poll的模型,poll的优缺点)

IO多路转接模型&#xff1a;select/poll/epoll 对大量描述符进行事件监控(可读/可写/异常) select模型 用户定义描述符的事件监控集合 fd_set&#xff08;这是一个位图&#xff0c;用于存储要监控的描述符&#xff09;; 用户将需要监控的描述符添加到集合中&#xff0c;这个描…

IO多路转接模型-----epoll

epoll&#xff1a; Linux下性能最高的多路转接模型 epoll 有3个相关的系统调用. epoll_create 功能&#xff1a;创建epoll&#xff0c;在内核中创建eventpoll结构体&#xff0c;size决定了epoll最多监控多少个描述符&#xff0c;在Linux2.6.8之后被忽略&#xff0c;但是必须…

再写单链表(不带头单链表)

单链表 实际中链表的结构非常多样&#xff0c;以下情况组合起来就有8种链表结构&#xff1a; 单向、双向带头、不带头循环、非循环 虽然有这么多的链表的结构&#xff0c;但是我们实际中最常用还是两种结构&#xff1a; 无头单向非循环链表&#xff1a;结构简单&#xff0…

再写双向循环链表

#pragma once #include<assert.h> #include<malloc.h> #include<stdio.h> typedef int DLDataType;//定义链表结点结构 typedef struct DListNode{DLDataType value;struct DListNode *prev; //指向前一个结点struct DListNode *next; //指向后一个结点 } DL…

链表题目--1 删除链表中所有等于val的值

注意事项 要删除的结点相邻第一个结点就是要删除的结点 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/struct ListNode* removeElements(struct ListNode* head, int val){if(headNULL){return NULL;}struct …

链表题目--2 求链表的中间结点 和 求链表中倒数第k个结点

求链表的中间结点 思路 一个走两步&#xff0c;一个走一步。一个走到尾&#xff0c;另外一个就走到了中间 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/struct ListNode* middleNode(struct ListNode* head…

链表题目---3 合并两个有序单链表 和 分割链表

合并两个有序单链表 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){if(l1 NULL){return l2;}else if(l2 NULL){return l1;}struc…

链表题目---4 删除链表中重复的结点 和 判断链表是否为回文链表

删除链表中重复的结点 /* struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {} }; */ class Solution { public:ListNode* deleteDuplication(ListNode* pHead){if(pHead NULL){return NULL;}ListNode *prev NULL; //用于删除的结点, 是…

链表题目----5 相交链表 和 环形链表 和 返回链表开始入环的第一个节点

相交链表 思路 链表交叉不可能是x型因为有可能两个链表不等长&#xff0c;所以我们必须让他们从同一起跑位置去起跑从同一起跑位置出发&#xff0c;依次比较每个结点的地址是否相同 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct L…

链表题目---6 复制带随机指针的链表

思路 将新结点放在老结点的后面 复制random 将链表拆开 /* // Definition for a Node. class Node { public:int val;Node* next;Node* random;Node() {}Node(int _val, Node* _next, Node* _random) {val _val;next _next;random _random;} }; */ class Solution { publi…

括号匹配问题(c和c++版本实现)

括号匹配问题 思路 遇见左括号入栈&#xff0c;遇见一个右括号弹出栈顶元素右括号入栈前如果栈已经为空&#xff0c;则不匹配如果不为空则读取并弹出&#xff0c;弹出来的元素与右括号做比较&#xff0c;必须匹配&#xff0c;不匹配返回false;如果最后栈里还有元素&#xff0c…

用队列实现栈 AND 用栈实现队列

用队列实现栈 思路 入队列就是入栈出队列的时候&#xff0c;就是把前面size-1个队列中的元素先出&#xff0c;这样最后一个元素就成队首元素了&#xff0c;再把出去的元素再次入队列读栈顶元素&#xff0c;过程和第二步是一样的&#xff0c;就是弹出后&#xff0c;再把它入队列…

最小栈的实现(设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。)

最小栈的实现 思路 两个栈&#xff0c;左边栈接受元素&#xff0c;右边栈存最小的元素入栈时&#xff0c;先入左边栈&#xff0c;随后进行比较&#xff0c;左边和右边栈顶元素进行比较&#xff0c;如果新元素小&#xff0c;就把新元素放在右边的栈顶位置&#xff0c;如果新元素…

再写循环队列----c++实现

再写循环队列 class MyCircularQueue { public:/** Initialize your data structure here. Set the size of the queue to be k. */MyCircularQueue(int k) {array (int *)malloc(sizeof(int)*k);capacity k;size 0;front 0;rear 0;}/** Insert an element into the circu…

再谈二叉树(二叉树概念,二叉树的性质,二叉树的存储结构)

树的概念 树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因 为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。它具有以下的特点&#xff1a;每个…

二叉树题目----1 前序中序后序遍历二叉树并返回相应的遍历(不是打印)

前序遍历 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*//*** Note: The returned array must be malloced, assume caller calls free().*/ int *array; int size;void _preorde…

二叉树题目----2 检查两颗树是否相同 和 对称二叉树的判定

检查两颗树是否相同 思路 根要相等 p->val q->val左子树相等 isSameTree(p->left,q->left)右子树也要相等 isSameTree(p->right,q->right) /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* …

二叉树题目---3 另一个树的子树 AND 二叉树最大深度

另一个树的子树 思路 两个数都遍历一遍&#xff0c;找到一个根结点相同时&#xff0c;判断以这个根结点为首的二叉树是否相等 前序遍历判断两棵树是否相同对于返回值的处理是难点 bool isSameTree(struct TreeNode *p, struct TreeNode *q) {if(p NULL && q NULL)…