5.网络原理之TCP_IP

1.网络基础

(1)IP地址

定义:

IP地址是指互联网协议地址,又译为网际协议地址,IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。


格式:

IP地址是一个32位的二进制数,通常被分割为4个"8位二进制数"(也就是4个字节),如:01100100.00000100.00000101.00000110。 通常用"点分十进制"的方式来表示,即 a.b.c.d 的形式(a,b,c,d都是0~255之间的十进制整数)。如: 100.4.5.6。


组成:

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

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

分类:

主机最大连接数减去2,是扣除主机号为全0和全1的特殊IP地址

(2)子网掩码

格式:

子网掩码格式和IP地址一样,也是一个32位的二进制数。其中左边是网络位,用二进制数字"1"表示;

  • 1的数目等于网络位的长度;右边是主机位,用二进制数字"0"表示,0的数目等于主机位的长度。

作用:

  • 划分子网

如一个B类IP地址:191.100.0.0,按A ~ E类分类来说,网络号二进制数为16位网络号+16位主机号。 假设使用子网掩码 255.255.128.0(即17) 来划分子网,意味着划分子网后,高17位都是网络位/网络号,也就是将原来16位主机号,划分为1位子网号+15位主机号。

  • 网络通信时,子网掩码结合IP地址,可以计算获得网络号及主机号,一般用于判断目的IP与本IP是否为同一个网段。

计算:

  • 将 IP 地址和子网掩码进行"按位与"操作(二进制相同位,与操作,两个都是1结果为1,否则为0),得到的结果就是网络号。
  • 将子网掩码二进制按位取反,再与 IP 地址位与计算,得到的就是主机号。

(3)MAC地址

用于标识网络设备的硬件物理地址。

  • 主机具有一个或多个网卡,路由器具有两个或两个以上网卡;其中每个网卡都有唯一的一个MAC地址。
  • 网络通信,即网络数据传输,本质上是网络硬件设备,将数据发送到网卡上,或从网卡接收数据。 硬件层面,只能基于MAC地址识别网络设备的网络物理地址。
  • MAC地址用来识别数据链路层中相连的节点; 长度为48位,及6个字节。一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19),在网卡出厂时就确定了,不能修改。
  • 虚拟机中MAC地址不是真实的MAC地址,可能会冲突;也有些网卡支持用户配置MAC地址。

(4)IP地址 VS MAC地址

  • IP地址描述的是路途总体的起点和终点;是给人使用的网络逻辑地址。
  • MAC地址描述的是每一跳的起点和终点;是给网络硬件设备使用的网络物理地址。

(5)网络设备及相关技术

  • 集线器:转发所有端口

集线器是工作在物理层的网络设备,发送到集线器的任何数据,都只是简单的将数据复制并转发到其他所有端口;

  • 交换机:MAC地址转换表+转发对应端口

交换机工作在数据链路层,交换机内部会记录并维护一张MAC****地址转换表

MAC地址转换表主要记录MAC地址与端口之间的映射。主机连接到交换机,及主机发送数据的时候,交换机可以学习并记录该主机MAC地址与端口信息。 交换机接收到数据报以后,在MAC地址转换表中,通过目的MAC查找到对应的端口,则目的主机为该端口相连接的主机。只需要将数据报转发到对应端口上即可;

  • 主机&路由器:ARP缓存表+ARP寻址

ARP是一个介于数据链路层和网络层之间的协议;ARP协议建立了IP地址与MAC地址的映射关系。

在数据链路层,寻找下一跳设备MAC地址的过程,称为ARP寻址:主机和路由器中都保存了一张ARP缓存表:通过IP地址可以找到对应的MAC地址;根据下一跳设备的IP地址,在ARP缓存表中能找到对应的MAC地址,则可以设置目的MAC并发送数据报;如果找不到,则发送ARP广播数据报:目的MAC为广播地址,询问下一跳设备的MAC地址;

  • 路由器:路由+NAPT

路由器作为网关,可以划分公网和局域网,某些路由器还可以将局域网划分为多个子网;

路由,即在复杂的网络结构中,找出一条通往终点的路线;

(6)冲突域

主机之间通过网络设备(集线器、交换机)的物理端口、网线相连时,两个主机在同一时刻同时发送数

据报,如果存在冲突,则该网络范围为一个冲突域

交换机可以分割冲突域,分割后,一个端口为一个冲突域

(7)广播域

广播是指某个网络中的主机同时向网络中其它所有主机发送数据(IP、MAC地址设置为广播地址),这个数据所能传播到的范围即为广播域


集线器接收到广播数据报,仍是简单的复制、转发到其他所有端口,所以集线器的所有端口为一个广播域。

交换机接收到广播数据报,会转发到其他所有端口;而路由器可以隔离广播域

2.网络数据传输流程

(1)局域网传输流程:集线器

使用集线器网络互联的情况下,发送端主机发送数据包时,需要先从上到下封装数据报。但封装时,目

的MAC可能并不知道,需要先进行ARP寻址:

  • 发送端在本机ARP缓存表中,根据目的IP查找对应的MAC地址
  • 如果找到,则可以在数据链路层以太网帧头中,设置目的MAC并发送数据包
  • 如果没有找到,需要先发送ARP广播请求,让目的主机告诉自己,目的MAC是多少
  • 发送端更新本机ARP缓存表:保存目的IP与目的MAC的映射
  • 有了目的MAC,就可以按照第(2)个步骤发送数据了。

(2)局域网传输流程:交换机

交换机保存有MAC地址转换表,记录MAC地址和端口的映射关系

  • 读取数据,可以知道源MAC的主机是连接哪个端口
  • 通过目的MAC查找对应的端口
  • 如果找到,直接将数据报转发到对应的端口
  • 如果找不到,将数据报广播到所有端口,目的主机返回响应,即可记录目的主机MAC与端口

3.应用层重点协议

(1)DNS

DNS,域名系统,是一整套从域名映射到IP的系统。

TCP/IP中使用IP地址来确定网络上的一台主机,但是IP地址不方便记忆,且不能表达地址组织信息,于是人们发明了域名,并通过域名系统来映射域名和IP地址。

  • 域名是一个字符串,如 www.baidu.com
  • 域名系统为一个树形结构的系统,包含多个根节点。其中:根节点即为根域名服务器,子节点主要由各级DNS服务器,或DNS缓存构成。
  • 网络通信发送数据时,如果使用目的主机的域名,需要先通过域名解析查找到对应的IP地址:
  • 域名解析的过程:发送端主机作为域名系统树形结构的一个子节点,通过域名 信息,从下到上查找对应IP地址的过程。如果到根节点(根域名服务器)还找不到,即找不到该主机。
  • 域名解析使用DNS协议来传输数据。DNS协议是应用层协议,基于传输层UDP或TCP协议来实现。

(2)NAT

NAT技术当前解决IP地址不够用的主要手段,是路由器的一个重要功能;

  • NAT能够将私有IP对外通信时转为全局IP,也就是就是一种将私有IP和全局IP相互转化的技术方法:
  • 很多学校,家庭,公司内部采用每个终端设置私有IP,而在路由器或必要的服务器上设置全局IP;
  • 全局IP要求唯一,但是私有IP不需要;在不同的局域网中出现相同的私有IP是完全不影响的;

由于NAT依赖这个转换表,所以有诸多限制:

无法从NAT外部向内部服务器建立连接; 转换表的生成和销毁都需要额外开销; 通信过程中一旦NAT设备异常,即使存在热备,所有的TCP连接也都会断开;

4.传输层重点协议

4.1TCP协议

TCP,传输控制协议,要对数据的传输进行一个详细的控制。

(1)协议段格式

(2)TCP原理

确认应答机制

TCP将每个字节的数据都进行了编号。即为序列号。每一个ACK都带有对应的确认序列号,意思是告诉发送者,我已经收到了哪些数据;下一次你从哪里开始发。

超时重传机制

主机A发送数据给B之后,可能因为网络拥堵等原因,数据无法到达主机B;如果主机A在一个特定时间间隔内没有收到B发来的确认应答,就会进行重发;但是,主机A未收到B发来的确认应答,也可能是因为ACK丢失了;

连接管理机制

TCP要经过三次握手建立连接,四次挥手断开连接

滑动窗口机制

一发一收的方式性能较低,那么我们一次发送多条数据,就可以大大的提高性能

流量控制

接收端处理数据的速度是有限的。如果发送端发的太快,导致接收端的缓冲区被打满,这个时候如果发送端继续发送,就会造成丢包,继而引起丢包重传等等一系列连锁反应;因此TCP支持根据接收端的处理能力,来决定发送端的发送速度。这个机制就叫做流量控制

  • 接收端将自己可以接收的缓冲区大小放入 TCP 首部中的 "窗口大小" 字段,通过ACK端通知发送端;
  • 窗口大小字段越大,说明网络的吞吐量越高;
  • 接收端一旦发现自己的缓冲区快满了,就会将窗口大小设置成一个更小的值通知给发送端; 发送端接受到这个窗口之后,就会减慢自己的发送速度; 如果接收端缓冲区满了,就会将窗口置为0;这时发送方不再发送数据,但是需要定期发送一 个窗口探测数据段,使接收端把窗口大小告诉发送端。

拥塞控制

TCP引入 慢启动机制,先发少量的数据,探探路,摸清当前的网络拥堵状态,再决定按照多大的速度传输数据;

此处引入一个概念程为拥塞窗口

  • 发送开始的时候,定义拥塞窗口大小为1;
  • 每次收到一个ACK应答,拥塞窗口加1;
  • 每次发送数据包的时候,将拥塞窗口和接收端主机反馈的窗口大小做比较,取较小的值作为实际发送的窗口;
    像上面这样的拥塞窗口增长速度,是指数级别的。"慢启动" 只是指初使时慢,但是增长速度非常快;为了不增长的那么快,因此不能使拥塞窗口单纯的加倍;此处引入一个叫做慢启动的阈值,当拥塞窗口超过这个阈值的时候,不再按照指数方式增长,而是按照线性方式增长

延迟应答

如果接收数据的主机立刻返回ACK应答,这时候返回的窗口可能比较小。

假设接收端缓冲区为1M。一次收到了500K的数据;如果立刻应答,返回的窗口就是500K; 但实际上可能处理端处理的速度很快,10ms之内就把500K数据从缓冲区消费掉了; 在这种情况下,接收端处理还远没有达到自己的极限,即使窗口再放大一些,也能处理过来; 如果接收端稍微等一会再应答,比如等待200ms再应答,那么这个时候返回的窗口大小就是1M;

(3)粘包问题

首先要明确,粘包问题中的 "包" ,是指的应用层的数据包。

  • 在TCP的协议头中,没有如同UDP一样的 "报文长度" 这样的字段,但是有一个序号这样的字段。
  • 站在传输层的角度,TCP是一个一个报文过来的。按照序号排好序放在缓冲区中。
  • 站在应用层的角度,看到的只是一串连续的字节数据。那么应用程序看到了这么一连串的字节数据,就不知道从哪个部分开始到哪个部分,是一个完整的应用层数据包。

如何避免粘包问题呢?归根结底就是一句话,明确两个包之间的边界

  • 对于定长的包,保证每次都按固定大小读取即可;例如上面的Request结构,是固定大小的,那么就从缓冲区从头开始按sizeof(Request)依次读取即可;
  • 对于变长的包,可以在包头的位置,约定一个包总长度的字段,从而就知道了包的结束位置;
  • 对于变长的包,还可以在包和包之间使用明确的分隔符

(4)TCP异常情况

  • 进程终止:进程终止会释放文件描述符,仍然可以发送FIN。和正常关闭没有什么区别。
  • 机器重启:和进程终止的情况相同。
  • 机器掉电/网线断开:接收端认为连接还在,一旦接收端有写入操作,接收端发现连接已经不在了,就会 进行reset。即使没有写入操作,TCP自己也内置了一个保活定时器,会定期询问对方是否还在。如果对方不在,也会把连接释放。

4.2UDP协议

(1)格式

(2)特点

  • **无连接 :**知道对端的IP和端口号就直接进行传输,不需要建立连接;
  • **不可靠:**没有任何安全机制,发送端发送数据报以后,如果因为网络故障该段无法发到对方,UDP协议层也不会给应用层返回任何错误信息;
  • **面向数据报 :**应用层交给UDP多长的报文,UDP原样发送,既不会拆分,也不会合并;
  • **缓冲区 :**UDP只有接收缓冲区,没有发送缓冲区:
  • **大小受限 :**UDP协议首部中有一个16位的最大长度。也就是说一个UDP能传输的数据最大长度是64K(包含UDP首部)。

(3)基于UDP的应用层协议

  • NFS:网络文件系统
  • TFTP:简单文件传输协议
  • DHCP:动态主机配置协议
  • BOOTP:启动协议(用于无盘设备启动)
  • DNS:域名解析协议

5.网络层重点协议

IP协议

  • 4位版本号:指定IP协议的版本,对于IPv4来说,就是4。
  • 4位头部长度:IP头部的长度是多少个32bit,也就是 length * 4 的字节数。4bit表示最大的数字是15,因此IP头部最大长度是60字节。
  • 8位服务类型:3位优先权字段(已经弃用),4位TOS字段,和1位保留字段(必须置为0)。4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。
  • 16位总长度:IP数据报整体占多少个字节。
  • 16位标识:唯一的标识主机发送的报文。如果IP报文在数据链路层被分片了,那么每一个片里面的这个id都是相同的。
  • 3位标志字段:第一位保留。第 二位置为1表示禁止分片,这时候如果报文长度超过MTU,IP模块就会丢弃报文。第三位表 示"更多分片",如果分片了的话,最后一个分片置为1,其他是0。类似于一个结束标记。
  • 13位分片偏移:是分片相对于原始IP报文开始处的偏移。其实就是在表示当前分片在原报文中处在哪个位置。实际偏移的字节数是这个值 * 8 得到的。因此, 除了最后一个报文之外,其他报文的长度必须是8的整数倍。
  • 8位生存时间:数据报到达目的地的最大报文跳数。一般是64。每次 经过一个路由,TTL -= 1,一直减到0还没到达,那么就丢弃了。这个字段主要是用来防止出现路由循环。
  • 8位协议:表示上层协议的类型。
  • 16位头部校验和:使用CRC进行校验,来鉴别头部是否损坏。
  • 32位源地址和32位目标地址:表示发送端和接收端。

6.数据链路层重点协议

6.1以太网

(1)定义

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

(2)以太网帧格式

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

6.2MTU

MTU相当于发快递时对包裹尺寸的限制。这个限制是不同的数据链路对应的物理层,产生的限制。

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

6.3ARP协议

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

  • 源主机发出ARP请求,询问"IP地址是192.168.0.1的主机的硬件地址是多少",并将这个请求广播到本地网段;
  • 目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中;
  • 每台主机都维护一个ARP缓存表,可以用arp -a命令查看。缓存表中的表项有过期时间,如果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址
相关推荐
MrSYJ2 天前
TCP协议理解
后端·tcp/ip
两个人的幸福9 天前
Windows 桌面应用自研 PHP 队列(下):完整代码与六大工程化优化
php
BingoGo11 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
JaguarJack11 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
用户30745969820712 天前
PHP 扩展——从入门到理解
php
鹏仔先生13 天前
拷贝漫画APP下载页PHP程序,后台带免费AI写作
php
网络研究院13 天前
2026年网络安全
网络·安全·法律·法规·趋势·发展
酣大智13 天前
ARP代理--工作原理
运维·网络·arp·arp代理
云水一下13 天前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php
treesforest13 天前
AI安全系统如何识别异常访问?IP风险识别正在成为关键能力
网络·人工智能·tcp/ip·安全·web安全