Linux网络编程总目录(点击下面链接即可到达对应章节)
Linux网络编程_01_网络基础
Linux网络编程_02_socket套接字
Linux网络编程_03_应用层HTTP协议
Linux网络编程_04_传输层UDP和TCP协议
Linux网络编程_05_网络层IP协议
Linux网络编程_06_数据链路层MAC帧协议
Linux网络编程_07_多路转接
文章目录
一. 认识以太网
以太网是一种技术标准, 既包含了数据链路层的内容,也包含了一些物理层的内容。规定了网络拓扑结构,访问控制方式, 传输速率等。以太网中的网线必须使用双绞线,传输速率有10M、100M、 1000M等。以太网是当前应用最广泛的局域网技术,和以太网并列的还有令牌环网,WLAN(无线局域网)等。
二. 以太网帧格式
2.1 帧格式
- 源地址和目的地址是指网卡的硬件地址(MAC地址),长度是48位,是在网卡出厂时固化的
- 帧协议类型字段有三种值,分别对应IP数据报(0800)、ARP(0806)、RARP(0835)
- CRC(Cyclic Redundancy Check),循环冗余校验码,用来检测或校验数据传输或者保存后可能出现的错误
2.2 解包和交付
解包: 以太网数据帧的格式是固定的,前面14字节,中间是数据,后面4字节的CRC校验,按照这个格式去截取数据就可以完成解包了
交付: 根据帧头的类型,如果是0800就交付给网络层的IP协议处理,如果是0806或者0835就ARP或者RARP协议处理
三. MTU
3.1 简述
以太网的最大传输单元(MTU),不同的网络类型有不同的MTU,CentOS7默认为1500字节(数据帧的数据部分)。如果一个数据报从以太网路由到拨号链路上,长度大于拨号链路的MTU了,则需要对数据包进行分片(fragmentation),不同的数据链路层标准的MTU是不同的。
3.2 MTU对IP协议的影响
将较大的IP包分成多个小包,到达对端时再将这些小包,会按顺序重组, 拼装到一起返回给传输层。一旦这些小包中任意一个小包丢失,接收端的重组就会失败,但是IP层不会负责重新传输数据。
3.3 MTU对UDP协议的影响
一旦UDP携带的数据超过1472(1500 - 20(IP首部) - 8(UDP首部)), 那么就会在网络层分成多个IP数据报。这多个IP数据报有任意一个丢失, 都会引起接收端网络层重组失败。 这就意味着,如果UDP数据报在网络层被分片,整个数据被丢失的概率就大大增加了。
3.4 MTU对TCP协议的影响
TCP数据段也是受制于MTU的, TCP的单个数据段的最大消息长度称为MSS(Max Segment Size)。如图所示,MTU减去IP和TCP的头部部分,剩下的就是MSS。TCP在建立连接的过程中,通信双方会进行MSS协商。双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值,然后双方得知对方的MSS值之后,选择较小的作为最终MSS。MSS的值就是在TCP首部的40字节变长选项中(kind=2)。了。
四. ARP协议
4.1 简介
ARP(Address Resolution Protocol地址解析协议),是一个介于数据链路层和网络层之间的协议,它建立了主机 IP地址和MAC地址的映射关系。在两台主机进行局域网通信时,可以先用IP通过ARP协议获取目的主机的MAC地址,再进行正常的通信。
4.2 ARP格式
- 硬件类型:链路层网络类型,1为以太网
- 协议类型: 要转换的地址类型,0x0800为IP地址
- 硬件地址长度: 以太网地址为6字节
- 协议地址长度: IP地址为4字节
- op字段: 为1表示ARP请求,op字段为2表示ARP应答
4.3 ARP协议的工作流程
- 发送端: 发出ARP请求,询问“IP地址是192.168.0.1的主机的硬件地址是多少”,并将这个请求广播到本地网段(以太网帧首部的目的地址填FF:FF:FF:FF:FF:FF表示广播,即发送给该网段的所有主机)
- 接收端: 接收端主机接收到ARP,先查看op字段,判断是ARP请求还是ARP相应。如果是请求,则将自己的IP地址和ARP包里面的目的IP地址匹配,则发送一个ARP应答数据包给源主机,将自己的MAC地址填写在应答包中
- 每台主机都维护一个ARP缓存表,可以用arp -a命令查看。缓存表中的表项有过期时间(一般为20分钟),如果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址
五. DNS协议
DNS(Domain Name System域名系统),是一整套从域名映射到IP的系统。像www.baidu.com就是一个域名,这个域名映射着我们访问的网站的IP地址,当我们在浏览器输入域名回车之后,DNS会将域名转化成对应的IP地址,然后再根据IP地址去访问对应的网站。在DNS协议提出之前,域名和IP的映射关系会保持到hosts文件里面,接入新的网络时会将新的映射关系在hosts更新,同时计算机也会定期从互联网上下载最新的hosts文件以确保用户可以正常地上网,现在Linux系统依然保留着hosts文件,CentOS下的路径为/etc/hosts。
六. ICMP协议
6.1 简述
ICMP协议是一个网络层协议,在IP的上面。一个新搭建好的网络,往往需要先进行一个简单的测试,来验证网络是否畅通。但是IP协议并不提供可靠传输, 如果丢包了,IP协议并不能通知传输层是否丢包以及丢包的原因,ICMP正是提供这种功能的协议。 ICMP主要功能有,确认IP包是否成功到达目标地址,通知在发送过程中IP包被丢弃的原因。ICMP也是基于IP协议工作的,但是它并不是传输层的功能,因此人们仍然把它归结为网络层协议。ICMP只能搭配IPv4使用,如果是IPv6的情况下,需要是用ICMPv6。ICMP大概分为两类报文,一类是通知出错原因,一类是用于诊断查询。
6.2 ping命令
ping命令不光能验证网络的连通性,同时也会统计响应时间和TTL(IP包中的Time To Live, 生存周期)。ping命令会先发送一个ICMP Echo Request给对端,对端接收到之后,会返回一个ICMP Echo Reply。ping命令是绕过传输层的,所以ping命令是不需要端口号的。
七. NAT技术
7.1 简述
NAT是一种将私有IP和全局IP相互转化的技术,本地地址(私有IP地址)的主机在和外界通信时,都要在NAT路由器上将其本地地址转换成全局的IP地址,才能和因特网连接。如下图所示,搭载NAT技术的路由器里面会维护着一张转换表,而对外转化后的IP地址是子网所有主机共用的,如图中转换后都是202.244.174.37。为了让每一台子网主机转换后得到的是转换表里唯一的地址,所以采用的是IP+port的映射关系。如图虽然他们的IP是一样的,但是port不一样,所以在接收到外面来的数据时,路由器就知道交付给哪台主机了。
7.2 NAT的缺点
无法从 NAT 的外部向内部服务器建立连接(NAT穿越)
维护转换表需要一定的开销
通信过程中一旦 NAT 遇到异常需重新启动时,所有的 TCP 连接都将被重置。即使备置两台 NAT 做容灾备份,TCP 连接还是会被断开。
7.3 代理服务器
7.3.1 简述
代理服务器看起来和NAT设备有一点像,客户端像代理服务器发送请求,代理服务器将请求转发给真正要请求的服务器,服务器返回结果后,代理服务器又把结果回传给客户端
7.3.2 正向代理
正向代理 是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。
正向代理的特点
- 访问原来无法访问的资源(例如google)
- 可以做缓存,加速访问资源
- 对客户端访问授权,上网进行认证
- 对内可以记录用户访问记录,对外隐藏用户信息
7.3.3 反向代理
反向代理(Reverse Proxy)实际运行方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
反向代理的特点
- 保证内网的安全,可以使用反向代理提供WAF功能,阻止web攻击大型网站,通常将反向代理作为公网访问地址,Web服务器是内网。
- 负载均衡,通过反向代理服务器来优化网站的负载
7.3.4 正向和方向代理对比
正向代理: client和代理服务器处于同一局域网,server是透明的
反向代理: server和代理服务器处于同一局域网,client是透明的
7.3.5 NAT和代理服务器
- 从应用上讲, NAT设备是网络基础设备之一,解决的是IP不足的问题。代理服务器则是更贴近具体应用,比如通过代理服务器进行科学上网,另外像迅游这样的加速器,也是使用代理服务器
- 从底层实现上讲,NAT是工作在网络层,直接对IP地址进行替换,代理服务器往往工作在应用层
- 从使用范围上讲,NAT一般在局域网的出口部署,代理服务器可以在局域网做,也可以在广域网做,也可以跨网
- 从部署位置上看, NAT一般集成在防火墙,路由器等硬件设备上, 代理服务器则是一个软件程序,需要部署在服务器上