Linux网络编程--网络传输
- Linux网络编程
- TCP/IP网络模型
- 网络通信的过程
- 局域网通信
- 跨网络通信:
- 问题总结:
Linux网络编程
TCP/IP网络模型
发送方(包装):
- 应用层:HTTP HTTPS SSH等 —> 包含数据,然后传递给传输层
- 传输层:TCP UDP ----> 封装时包装源端口和目标端口,然后传递给网络层
- 网络层:IP ----> 封装时包装源IP地址和目标IP地址,然后传递给链路层
- 链路层:封装成数据帧(以太网帧),封装后发送到物理网络中传输
接收方 (解包):
- 链路层:数据包到达目标机器,目的机器得到数据包,去掉数据包的头尾,然后传递给网络层
- 网络层:确认IP报文的目标是否是自己,如果是则继续处理,如果不是则抛弃,如果数据包分片则收集全部分片,然后传递为传输层
- 传输层:检查相应的端口字段,然后传递给应用层
- 应用层:消息抵达
数据封装成以太网帧格式流程:
以太网帧格式:
以太网目的地址:目的地的MAC地址 --> 硬件地址 --> 网卡编号 例如:00:0c:29:ec:46:18
以太网帧首部的硬件地址(也就是目的地址)填FF:FF:FF:FF:FF:FF表示广播
以太网源地址:自己的 MAC地址
类型:通过类型变换实现发送不同的数据包
- 0800 数据段存放发送的内容 如 “你还欠我两块钱”
- 0806 数据段存放ARP请求/应答 作用:请求下一个路由节点的地址
- 0835 数据段存放RARP请求/应答
以太网IP地址:如192.168.190.129
网络通信的过程
IP地址:在网络上唯一标识一台主机
端口号:在主机中唯一表示一个进程
IP+port:在网络环境中唯一标识一台主机的一个进程(socket)
局域网通信
ARP协议
作用:根据目标IP地址得到目标的MAC地址
原因:我们知道目的机器的IP地址,但不知道目的机器的MAC地址
注意:ARP协议只能在同一个局域网内使用
工作原理:
本地机器会先查询自己的路由表,如果与目标机器在同一个局域网时,本地机器向局域网发送ARP请求广播,局域网上的所有设备都能接收到这个请求,目的机器接收到广播后会比较以太网帧格式中的目的IP地址,如果与自己的IP地址相同,那么直接向本地机器返回自己的应答包(里面包含自己的MAC地址,与本地机器发送广播的流程相同),如果与自己的IP地址不同则抛弃。请求者得到回应后会更新自己的ARP缓存(这是一个存储IP地址对应MAC地址的映射表)。下次再发送数据给同一个IP地址时,就可以直接查看自己的ARP缓存获取目标机器的MAC地址,而不是再次广播ARP请求。有了目标MAC地址后,发送设备可以构造以太网帧,并通过物理媒体发送数据给目标设备。
跨网络通信:
default:默认网关,为默认网关IP地址
路由表:
路由表记录着局域网的相关信息
- 第一行指示网络192.168.0.0/24可以通过直接连接的方式(
direct
)来访问,这个网络连接到了接口lan1
。- 第二行显示网络192.168.1.0/24也是直接可达的,通过接口
lan2
。每个
/24
表示子网掩码是255.255.255.0,意味着每个网络可以容纳256个IP地址(包括网络和广播地址),其中192.168.0.0/24和192.168.1.0/24就是路由表记录的局域网信息
过程:
本地机器会先查询自己的路由表,发现与目标机器不在同一个局域网内,本地机器会找到自己配置中默认网关(见上面第一张图)的地址IP,由于在同一个局域网内,所以能通过APR请求得到默认网关的MAC地址,然后将TCP/IP数据包发送给这个MAC地址,但TCP/IP数据包的目标IP还是原来的目标机器IP(但需要根据NAT映射映射为公有IP地址,一般时路由的公有IP,会有一个新的IP和新的端口号,最后入站时通过映射转换为原来的IP,但目标机器IP不会映射,这需要注意),因为他们封装在网络层,只不过后面通过网关地址发送ARP请求的源地址IP和目标地址IP会变,在TCP/IP数据包到达路由器后,路由器会对TCP/IP数据包解包,解包到网络层获得目标地址IP,然后查询自己的路由表(路由表是用于决定如何将数据包从一个网络路由到另一个网络的指南。它包含了目标地址、下一跳地址和通过哪个接口转发数据包的信息,里面包含着局域网的信息,见上面第二张图。路由器使用路由表来决定数据包的转发路径,它并不会进行广播,ARP只会在寻找网关和目标地址时才进行),如果路由表查询到对应的局域网信息就将数据包发送给对应的路由节点,然后通过ARP协议寻找目标机器MAC地址,实现数据传递,然后更新本地机器的ARP缓存。如果找不到对应局域网的信息,路由器就会通过自己的默认网关向更高层级的网络发送ARP数据包,得到写一个路由的MAC地址,重复直到找到对应局域网,找到目标机器MAC地址。
问题总结:
- 进行网络传输前需要做什么(没有ARP缓存)?
在进行传输前我们需要封装成以太网格式,在以太网格式形成之前我们需要进行ARP请求,在进行ARP请求前,我们需要根据路由表判断是否在同一个局域网内,如果再同一局域网,则先查询ARP缓存,如果不在同一个局域网还是先查询ARP缓存看有没有默认网关的MAC地址,如果没有再发送ARP请求。所以第一步需要根据路由表判断是否在同一个局域网内
2.数据传输是根据哪个地址进行传输的?
根据MAC地址进行传输
3.ARP请求/应答成功后做什么?
更新本地机器的ARP缓存,以后的传输直接根据MAC地址传输,不会再发送ARP请求广播
4.ARP请求在什么时候进行?
在用一个局域网内:ARP请求一次
不在同一个局域网时:会在请求默认网关MAC地址和最后一跳时执行,至少请求两次
5.非局域网通信寻址进行的依据是什么?
通过使用默认网关和分层的网络结构,加上各种路由协议在网络中传播路由信息,数据包可以被有效地从源头路由到目的地。
6.目标机器对比ARP包中的目标IP,是因为我们解压到了ARP包的”网络层“了吗?
不是,虽然ARP包是以以太网帧的格式发送的,但他的封装过程与我们所认为的TCP/IP数据包并不相同,ARP包的实现只是在链接层进行的,并没有进行一层一层的包装,所有并没有网络层这一说法。
7.目标机器解包时进行到了哪一层?
链接层,对于ARP来说,尽管它处理的是网络层的地址信息(对比IP地址),但ARP请求和响应的生成和处理主要发生在链路层,对于ARP来说,尽管它处理的是网络层的地址信息,ARP请求和响应的生成和处理主要发生在链路层,不经过上层协议栈的其他层次。IP对比是计算机操作系统进行的,计算机操作系统利用链接器内部解决IP到MAC的映射问题。
8.TCP/IP数据包传输的过程中什么变什么不变?
TCP/IP数据包网络层封装的目标地址IP不变,但是在发送TCP/IP数据包传递过程中的ARP数据包的源地址IP和目标地址IP会变,每个路由都会对TCP/IP数据包解包到网络层,但并不会改变目标机器的IP地址。
9.什么时候会进行NAT地址映射?
NAT地址映射通常在流量从私有网络出站到公共网络(如互联网)时进行,用于将私有IP地址转换为公共IP地址(一般路由器的IP)。此外,对于入站流量(即从互联网到私有网络),通过特定的NAT规则(如端口转发),公共IP地址和端口号也可以被映射回内网的特定私有IP地址和端口号。
10.NAT地址映射进行的几次?
对于每个单独的连接,NAT转换通常在数据包离开私有网络时发生一次。对于入站连接,如果通过端口转发来指定,NAT转换同样会在数据包进入私有网络时发生一次,以将数据包导向内网中的特定设备。
11.链接层在公网和局域网中发生的作用?
链路层在局域网(LAN)中的作用
- 数据帧传输:在局域网内,链路层主要负责在直接相连的设备之间传输数据帧。这包括处理帧的封装、帧的定界以及错误的检测和纠正。
- MAC地址使用:链路层使用MAC地址来标识网络上的设备,这在局域网环境中尤其重要,因为设备间的通信通常是基于这些物理地址进行的。
链路层在广域网(WAN)/公网中的作用
- 物理传输:虽然在广域网或公网环境中,数据包需要通过许多跳(即路由器)来到达目的地,每一跳之间的传输依然依赖于链路层协议和标准。每个路由器到下一个路由器的传输过程都是通过链路层完成的。
- 不同技术标准:公网或广域网涉及更多种类的物理介质和数据链路协议(如光纤、DSL、以太网等),链路层为这些不同的传输技术提供了统一的数据传输服务。