Linux 网络基础(2)

TCP/IP模型将我们的网络划分为四层,分别为数据链路层,传输层,网络层以及应用层

我们先来了解一下网络数据包传送的过程:

  • 下图所示为主机A的应用程序1向主机B的应用程序2发送数据包封包(在主机A中完成)和拆包(在主机B中完成)过程
    这里写图片描述
  • 详细过程我会在下面每一层中分开阐述

数据链路层


以太网

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

这里写图片描述

  • 目的地址如果不知道,则需要启动ARP请求(所有和这台机器有连接的都会收到ARP请求)
  • 源地址是自己的MAC地址
  • 帧协议类型(上层(网络层)协议类型)字段有三种值,分别对应IP、ARP、RARP
  • 帧末尾是CRC校验码,常见的有循环冗余校验码等
MAC地址
  • MAC地址是指网卡的硬件地址,长度是48位,一般用16进制数字加上冒号的形式来表示(08:00:27:03:fb:19),是在网卡出厂时固化的
  • MAC地址用来识别数据链路层中相连的节点
  • MAC地址在出厂时就确定了,不能修改。MAC地址通常是唯一的(虚拟机中的MAC地址不是真实的MAC地址,可能会冲突;也有些网卡支持用户配置MAC地址)
  • MAC地址在组包的时候是可变的,不一定和网卡一样

IP地址和MAC地址

  • IP地址描述的是路途总体的起点和终点
  • MAC地址描述的是路途上的每一个区间的起点和终点
MTU
  • MTU:最大传输单元。相当于发快递是对包裹尺寸的限制,这个限制是不同的数据链路对应不同的物理层产生的限制
  • 以太网帧的数据长度规定为46-1500字节;ARP的数据包不够46字节要在后面补位
  • 以太网的MTU为1500,不同的网络类型有不同的MTU
  • 路径MTU:从源到目的整个过程中最小的MTU即为路径MTU
  • 如果在发送数据时,数据包的大小超过路径MTU的大小,则需要对数据包进行分片

查看硬件地址和MTU
这里写图片描述

MTU对IP协议的影响
由于数据链路层MTU的限制,对于较大的IP数据报要进行分包

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

MTU对UDP协议的影响
- 一旦UDP携带的数据超过1427(1500-20(IP头部)-8(UDP头部)),那么就会在网络层分成多个IP数据包
- 若丢失任意一个小包,都会引起对端网络层重组失败。所以如果UDP数据在网络层被切片,整个数据丢失的概率会大大增加

MTU对TCP协议的影响
- TCP单个数据报的最大消息长度成为MSS,MSS的值就是在TCP头部的40字节边长选项中(kind=2)
- TCP在建立连接的过程中双发会进行MSS协商,双方在发送SYN时会在TCP头部写入自己能支持的MSS值;双方在得知对方的MSS值后,会选择较小的MSS作为最终的MSS值

ARP协议
  • ARP(Address Resolution Protocol)即地址解析协议, 用于实现从 IP 地址到 MAC 地址的映射,即询问目标IP对应的MAC地址
  • 注意:ARP不是一个单纯的数据链路层协议,而是介于链路层和网络层之间的协议
  • 在网络通讯中,数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃;因此在通讯之前必须获得目的主机的硬件地址,这是就需要借助我们的ARP协议了

ARP数据报的格式
这里写图片描述

  • 注意到源MAC地址和目的MAC地址在以太网的首部和ARP请求中个出现了一次,对于链路层为以太网的情况是多余的,但是对于其他网络来说是必要的
  • 硬件类型指链路层网络类型,1为以太网
  • 协议类型指要转换的地址类型,0x0800为IP地址
  • 硬件地址长度对于以太网来说是6字节
  • 协议地址长度对于IP地址来说是4字节
  • op字段为1表示ARP请求,op字段为2表示ARP应答

为了获得目的主机的硬件地址我们需要进行ARP广播,每次找到与我们在同一网段的下一跳的MAC地址,直到找到目的IP的MAC地址,如下图示:
这里写图片描述
这里写图片描述

  • 源主机会将ARP请求广播到本地网段
  • 以太网首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播
  • 回发数据包的时候会将目标MAC,IP存一份在ARP缓存表中,方便下次找路
  • 每一台主机都维护一个ARP缓存表,缓存表中的表项右过期时间(一般为20分钟),如果20分钟内没有再次使用某个表象,则该表项失效,下次还要发送ARP请求来获得目的主机的,我们可以通过命令查看ARP缓存表:
    这里写图片描述
  • 若有机器出现故障,消息发送不出去,则要通过ICMP协议给发送端回应,ICMP协议会在下一节说到

网络层


网络层主要功能:将数据包封装成IP数据包,并运行必要的路由算法,有效的找到达到目的主机最优的路径

几个基本概念
- 主机:配有IP地址,但是不进行路由控制的设备
- 路由器:既配有IP地址,又能进行路由控制
- 节点:主机和路由器的统称

IP头

IP协议头格式
这里写图片描述

  • 由图可知,每行占用的位数为32位,即IP数据包的包头数据是32位的倍数

各个包头内容介绍如下:

  • 4位版本号:指定IP协议的版本;IPv4:0100;IPv6:0110
  • 4位首部长度:IP头部的长度是length个32bit,也就是length*4的字节数。4bit表示最大的数字是15,所以IP头部最大的长度为60字节
  • 8位服务类型:3位优先权字段(已弃用),4位TOS字段:分别表示最小延时、最大吞吐量、最高可靠性、最小成本,这四者相互冲突只能选一个(对于ssh/telnet,最小延时比较重要,对于ftp,最大吞吐量比较重要),选哪个哪位置1;1位保留字段,必须置为0
  • 16位总长度:IP数据报整体占对少字节(IP头和IP数据)
  • 16位标识:唯一的标识主机发送的报文。若IP报文在数据链路层被分片了,那么每一片里面的ID相同
  • 3位标志字段:第1位保留(还没想好怎么用);第2位置1,表示禁止分片,若此时报文长度超过了MTU,IP模块就会丢弃报文;第3位表示”更多分片”,若切片的话,最后一个分片 置为1(没有更多分包了),其他是0(还有后续包);类似与一个结束标记
  • 13位片偏移:是分片相对于原始IP报文开始处的偏移。实际偏移的字节数是这个值*8得到的。因此,除了最后一个报文外,其他报文的长度必须是8的整数倍(否则报文不连续)
  • 8位生存时间:数据报到达目的地的最大报文跳数。一般是64。每经过一个路由TTL-=1,一直减到0还没到达,那么就丢弃了。这个字段主要用来防止出现路由循环
  • 8位协议:表示上层协议的类型(传输层TCP/UDP)
  • 16为首部校验和:使用CRC进行校验,检查头部是否损坏(首部每经过一个路由器都会变)
  • 32位源IP和目的IP地址:发送端和接收端
路由过程
  • 路由的过程,就是一跳一跳的”问路的过程”。所谓”一跳”就是数据链路层中的一个区间。具体在以太网中指从源MAC到目的MAC地址之间的帧传输区间
  • 数据链路实现某一个区间(一跳)内的通信,而IP实现直至最终目标地址的通信(点对点)

数据包的传输

  • 当IP数据包, 到达路由器时, 路由器会先查看目的IP;
  • 路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下⼀个路由器;
  • 依次反复, ⼀直到达目标IP地址;

那么如何判定当前这个数据包该发送到哪⾥呢? 这个就依靠每个节点内部维护⼀个路由表;我们可以通过route命令来查看当前主机的路由表:
这里写图片描述

  • Destination:目的网络地址;Gateway:下一跳的地址;Genmask:子网掩码;U此条目有效;G标志表示此条目的的下一跳地址是某个路由器的地址;没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经由路由器转发
  • 如果目的IP命中了路由表,就直接转发即可;
  • 路由表的最后一行主要有下一跳地址和发送接口两部分组成,当目的地址与路由表中其他行都不匹配时,就按缺省路由条目规定的接口发送下一跳的地址

根据上面的本机的路由表,叙述转发实例:

  • 首先本机有一个网络接口,172.16.0.0;如果要发送的数据包的目的地址是172.16.6.3,跟路由表的第2行的子网掩码进行与运算,得到172.16.0.0,与第2行的目的地址相符,因此从ens33接口发送出去;由于172.16.0.0是直接与ens33接口直接相连的网络,因此可以直接发送到目的主机,不必经路由器转发
  • 如果发送的数据包的目的地址是202.10.1.2,依次和路由表前几项进行对比,发现都不匹配,则按照缺省路由条目,从virbr0接口发出去,发送到192.168.122.0路由器;有路由器根据它的路由表决定下一跳的地址
ICMP协议

一个新搭建好的网络,往往需要先进行一个简单的测试,来验证网络是否畅通;但是IP协议并不提供可靠传输,如果包丢了,IP协议并不能通知传输层是否丢包以及丢包的原因,这使我们就需要ICMP协议来提供这种功能了

ICMP主要功能包括:

  • 确认IP包是否成功到达目标地址
  • 通知在发送过程中IP包被丢弃的原因
  • ICMP也是基于IP协议工作的,但是它并不是传输层的功能,因此人们仍然把它归结为网络层协议
  • ICMP只能搭配IPv4使用,如果是IPv6,则需要使用ICMPv6
  • ICMP大概分为两类报文:一类是通知出错原因;一类是用于诊断查询

ping命令:验证网络的连通性,统计响应时间TTL(基于ICMP)
traceroute命令:打印出可执行程序主机到目标主机之前经历多少路由器(基于ICMP)

一个面试中的坑:

  • telnet是23端口,ssh是22端口,那么ping是什么端口?
  • 注意:ping命令基于ICMP,在网络层,而端口号是传输层的内容,在ICMP中根本就不需要关注端口好的信息

传输层


端口号
  • 无符号的short类型的数据
  • 标识了一个主机上进行通信的不同应用程序(进程)
  • 端口号划分:0~1023为知名端口号,HTTP、FTP、SSH等这些广为使用的应用层协议,它们的端口号是固定的;1024~65535为操作系统动态分配的端口号,客户端程序的端口号就是有操作系统从这个范围分配的

一些知名的端口号

  • ssh服务器:22端口
  • ftp服务器:21端口
  • telnet服务器:23端口
  • http服务器:30端口
  • https服务器:443端口
  • 可通过执行下面的命令,来查看知名的端口号:cat /etc/services
  • 我们自己写一个程序使用端口号的时候,要避开这些知名的端口号

  • 在TCP/IP协议中,用”源IP”、”源端口号”、”目的IP”、”目的端口号”、”协议号”这样一个五元组来标识一个通信

  • 通过netstat -n命令查看:
    这里写图片描述
TCP

TCP数据包包头信息如下所示:
这里写图片描述

  • 源端口和目的端口:传送/接收数据使用的端口
  • 32位序号和确认序号:为了确认接收端收到发送端所送出的数据包数据,发送端希望能够接收到接收端的回应
  • 控制标志码:当网络进行连接时,必须说明这个联机的状态,是接收端了解这个数据包的主要动作。这个字段为6bits,分别代表6个句柄,若为1则为启动
URG 为1表示为紧急数据包,接收端应紧急处理
ACK 为1表示这个数据包的ACK确认值有效
PSH 为1表示要求对方立即传送缓冲区内数据给应用层,而无须等待缓冲区满
RST 为1表示对端已关闭
SYN 为1表示发送端希望双方建立同步处理(“主动”建立连接),即要求建立联机
FIN 为1表示传送结束,通知对方数据传送完毕,是否同意断线
  • 16位窗口:滑动窗口,用于流量控制,可以告知对方目前有多少缓冲区容量可以接受数据包。当window=0表示缓冲区已满
  • 校验和:用于差错控制
  • 紧急指针:该字段在Code字段内的URG值为1时才会产生作用。告知紧急数据所在位置

TCP的特点:

  • 面向字节流:数据与数据之间无边界(会导致TCP黏包问题;数据发送过程中可能会分包,因为流式,所以最终恢复回来的数据包中的数据可能被打乱)
  • 面向连接:通信之前要建立三次握手,握手成功后才进行真正的通信;断开谅解时会有四次挥手
  • 可靠传输:确认应答、超时重传、连接管理、流量控制、拥塞控制机制;保证了数据传送的过程中不会丢包,不会有重复包
  • 缓冲区:创建一个TCP的socket,同时在内核中创建一个发送缓冲区和一个接收缓冲区;由于缓冲区的存在,TCP程序的读和写不需要一一匹配
  • 全双工:TCP的socket既能读也能写
  • 流量控制:窗口机制

基于TCP的应用层协议

  • HTTP、HTTPS、SSH、Telnet、FTP、SMTP

关于TCP建立连接的三次握手和四次挥手过程我会在下一篇博客中阐述

UDP

这里写图片描述

UDP的特点:

  • 无连接:直到对端的IP协议和端口号直接进行传输,不需要建立连接
  • 不可靠:没有确认机制,没有重传机制;如果因为网络故障该段无法发到对方,UDP协议也不会给应用层返回任何错误信息
  • 面向数据报:不能够灵活的控制读写数据的次数和数量(应用层交给UDP多长的报文,UDP原样发送,既不会拆分,也不会合并)
  • UDP无真正意义上的发送缓冲区,调用sendto会直接交给内核,有内核将数据传给网络层协议进行后续的传输动作;但是UDP有接收缓冲区,但是其不能保证收到的UDP报的顺序和发送UDP报的顺序一致;如果缓冲区满了,在到达的UDP数据就会被丢弃
  • 全双工:UDP的socket既能读也能写

基于UDP的应用层协议

  • NFS(网络文件系统)、TFTP(简单文件传输协议)、DHCP(动态主机配置协议)、BOOTP(启动协议)、DNS (域名解析协议)

应用层


  • HTTP协议—超文本传输协议
  • DNS协议—域名解析

猜你喜欢

转载自blog.csdn.net/aurora_pole/article/details/80301004