在TCP/IP协议族中,数据链路层主要有三个目的
TCP/IP支持多种不同的链路层协议,这取决于网络所使用的硬件,如以太网、
令牌环网、FDDI(光纤分布式数据接口)及RS-232串行线路等。
以太网这个术语一般是指数字设备公司(DigitalEquipmentCorp.)、英特尔公司(IntelCorp.)
和Xerox公司在1982年联合公布的一个标准。它是当今TCP/IP采用的主要的局域网技术。它采用一种
称作CSMA/CD的媒体接入方法,其意思是带冲突检测的载波侦听多路接入(CarrierSense,
MultipleAccesswithCollisionDetection)。它的速率为10Mb/s,地址为48bit。
后来,IEEE(电子电气工程师协会)802委员会公布了一个稍有不同的标准
集,其中802.3针对整个CSMA/CD网络,802.4针对令牌总线网络,
802.5针对令牌环网络。这三者的共同特性由802.2标准来定义,那就是8
02网络共有的逻辑链路控制(LLC)。
IEEE802.2-802.3和以太网的数据帧封装格式如图2.2.1。
PPP,点对点协议修改了SLIP协议中的所有缺陷。PPP包括以下三个部分:
PPP数据帧的格式
PPP数据帧字段
PPP&SLIP相同点
总的来说,PPP比SLIP具有下面这些优点:
大多数的产品都支持环回接口(Loopback Interface),以允许运行在同一台主机上
的客户程序和服务器程序通过TCP/IP进行通信。A类网络号127就是为环回接口预留的。根
据惯例,大多数系统把IP地址127.0.0.1分配给这个接口,并命名为localhost。一个传
给环回接口的IP数据报不能在任何网络上出现。
我们所想象的是,一旦传输层检测到目的端地址是环回地址时,应该可以省略部分传输
层和所有网络层的逻辑操作。但是大多数的产品还是照样完成传输层和网络层的所有过
程,只是当IP数据报离开网络层时把它返回给自己。
图2.2.3是环回接口处理IP数据报的简单过程
图中需要指出的关键点有:
看上去用传输层和IP层的方法来处理环回数据似乎效率不高,但它简化了设计,因为
环回接口可以被看作是网络层下面的另一个链路层。网络层把一份数据报传送给环回接
口,就像传给其他链路层一样,只不过环回接口把它返回到IP的输入队列中。
图2-4中,另一个隐含的意思是送给主机本身IP地址的IP数据报一般不出现在相应的
网络上。例如,在一个以太网上,分组一般不被传出去然后读回来。某些BSD以太网的
设备驱动程序的注释说明,许多以太网接口卡不能读回它们自己发送出去的数据。
4.4BSD系统定义了变量useloopback,并初始化为1。但是,如果这个变量置为0,
以太网驱动程序就会把本地分组送到网络,而不是送到环回接口上。它也许不能工作,
这取决于所使用的以太网接口卡和设备驱动程序。
字段 | 含义 |
---|---|
4位版本号 | 指的是IP协议的版本信息目前的协议版本号是4,因此IP有时也称作IPv4。将来IPv6将会普及。 |
4位首部长度 | 指的是头部占32bit字的数目(头部的"选项"字段也计算在内),最多标识15个32bit,也就是首部最长位60字节。不带选项的IP报文该字段值为5,也就是首部固定大小20字节。 |
8位服务类型 | 服务类型(TOS)字段包括一个3bit的优先权子字段(现在已被忽略),4bit的TOS子字段和1bit未用位但必须置0。4bit的TOS分别代表:最小时延、最大吞吐量、最高可靠性和最小费用。4bit中只能置其中1bit。如果所有4bit均为0,那么就意味着是一般服务。新的路由协议如OSPF和IS-IS都能根据这些字段的值进行路由决策。不同应用建议的TOS值见图2.3.2。 |
16位总长度(字节数) | 总长度字段是指整个IP数据报的长度,以字节为单位。利用首部长度字段和总长度字段,就可以知道IP数据报中数据内容的起始位置和长度。由于该字段长16比特,所以IP数据报最长可达65535字节,超级通道的MTU为65535。尽管可以传送一个长达65535字节的IP数据报,但是大多数的链路层都会对它进行分片。 |
16位标识 | 标识字段唯一地标识主机发送的每一份数据报。通常每发送一份报文它的值就会加1。 |
3位标志 | 标志字段和片偏移字段在分片时使用 |
13位片偏移 | 标志字段和片偏移字段在分片时使用 |
8位生存时间(TTL) | TTL(time-to-live)生存时间字段设置了数据报可以经过的最多路由器数。它指定了数报的生存时间。TTL的初始值由源主机设置(通常为32或64),一旦经过一个处理它的路由器,它的值就减去1。当该字段的值为0时,数据报就被丢弃,并发送ICMP报文通知源主机。可以使用traceroute命令来分析。 |
8位协议 | 指明其上层协议类型(TCP/UDP/ICMP/IGMP,etc.),在分用1的时候各报文的首部协议字段会被程序检查,以确定其上层协议类型。 |
16位首部检验和 | 首部检验和字段是根据IP首部计算的检验和码。它不对首部后面的数据进行计算。ICMP、IGMP、UDP和TCP在它们各自的首部中均含有同时覆盖首部和数据检验和码。2 |
32位源IP地址 | 数据的源主机IP地址 |
32位目的地址 | 数据的目的主机IP地址 |
选项 | 最后一个字段是任选项,是数据报中的一个可变长的可选信息。目前,这些任选项定义这些选项很少被使用,并非所有的主机和路由器都支持这些选项。 |
尽管TCP和UDP都使用相同的网络层(IP),TCP却向应用层提供与UDP完全
不同的服务。TCP提供一种面向连接的、可靠的字节流服务。
面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数
据之前必须先建立一个TCP连接。这一过程与打电话很相似,先拨号振铃,等待对方摘
机说“喂”,然后才说明是谁。
在一个TCP连接中,仅有两方进行彼此通信。在第12章介绍的广播和多播不能用于TCP。
TCP通过下列方式来提供可靠性:
•应用数据被分割成TCP认为最适合发送的数据块。这和UDP完全不同,应用程序产生的
数据报长度将保持不变。由TCP传递给IP的信息单位称为报文段或段(segment)(参见
图1-7)。在18.4节我们将看到TCP如何确定报文段的长度。
•当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能
及时收到一个确认,将重发这个报文段。在第21章我们将了解TCP协议中自适应的超时
及重传策略。
•当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,
通常将推迟几分之一秒,这将在19.3节讨论。
•TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输
过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到
此报文段(希望发端超时并重发)。
•既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段
的到达也可能会失序。如果必要,TCP将对收到的数据进行重新排序,将收到的数据以
正确的顺序交给应用层。
•既然IP数据报会发生重复,TCP的接收端必须丢弃重复的数据。
•TCP还能提供流量控制。TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只
允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲
区溢出。
两个应用程序通过TCP连接交换8bit字节构成的字节流。TCP不在字节流中插入记录标识
符。我们将这称为字节流服务(bytestreamservice)。如果一方的应用程序先传10字节,又传
20字节,再传50字节,连接的另一方将无法了解发方每次发送了多少字节。收方可以分4次接
收这80个字节,每次接收20字节。一端将字节流放到TCP连接上,同样的字节流将出现在
TCP连接的另一端。
另外,TCP对字节流的内容不作任何解释。TCP不知道传输的数据字节流是二进制数据,
还是ASCII字符、EBCDIC字符或者其他类型数据。对字节流的解释由TCP连接双方的应用层
解释。
这种对字节流的处理方式与Unix操作系统对文件的处理方式很相似。Unix的内核对一个应用读或写的内容不作任何解释,而是交给应用程序处理。对Unix的内核来说,它无法区分一个二进制文件与一个文本文件。 |
---|
小结 | |
---|---|
TCP提供了一种可靠的面向连接的字节流运输层服务。 | |
TCP将用户数据打包构成报文段;它发送数据后启动一个定时器;另一端对收到的数据进行确认,对失序的数据重新排序,丢弃重复数据;TCP提供端到端的流量控制,并计算和验证一个强制性的端到端检验和。 | |
许多流行的应用程序如Telnet、Rlogin、FTP和SMTP都使用TCP。 |
在使用TCP建立端到端(客户端到服务器)的通讯前必须进行以下三步,如图2.4.2红线以上部分所示。:
RFC 793 [Postel 1981c] 指出MSL为2分钟。然而,实现中的常用值是30秒,1分钟,或2分钟。 |
---|
1.A类地址:
0000 0000 - 0111 1111: 1-127
网络数:126, 127
每个网络中的主机数:2^24-2
默认子网掩码:255.0.0.0
私网地址:10.0.0.0
2.B类地址:
1000 0000 - 1011 1111:128-191
网络数:2^14
每个网络中的主机数:2^16-2
默认子网掩码:255.255.0.0
私网地址:172.16.0.0-172.31.0.0
3.C类地址:
1100 0000 - 1101 1111: 192-223
网络数:2^21
每个网络中的主机数:2^8-2
默认子网掩码:255.255.255.0
私网地址:192.168.0.0-192.168.255.0
4.D类地址:
D类地址为组播地址
1110 0000 - 1110 1111: 224-239
0.0.0.0
0.0.0.0不是一个真正意义上的IP地址。它表示所有不清楚的主机和目的网络
255.255.255.255
限制广播地址。对本机来说,这个地址指本网段内(同一广播域)的所有主机
127.0.0.1~127.255.255.254
本机回环地址,主要用于测试。在传输介质上永远不应该出现目的地址为“127.0.0.1”的数据包
224.0.0.0到239.255.255.255
组播地址,224.0.0.1特指所有主机,224.0.0.2特指所有路由器。224.0.0.5指OSPF路由器,地址多用于一些特定的程序以及多媒体程序
169.254.x.x
如果Windows主机使用了DHCP自动分配IP地址,而又无法从DHCP服务器获取地 址,系统会为主机分配这样地址
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dSVbvX9E-1691465939060)(png/Linux网络相关配置文件.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d2HYPdbQ-1691465939060)(png/2019-10-24-21-39-27.png)]
ifconfig [interface]
ifconfig -a
ifconfig IFACE [up|down]
ifconfig interface [aftype] options | address ...
ifconfig IFACE IP/netmask [up]
ifconfig IFACE IP netmask NETMASK
注意:该命令更改后立即生效
启用混杂模式:[-]promisc
查看:route -n
添加:route add
route add [-net|-host] target [netmask Nm] [gw Gw] [[dev] If]
目标:192.168.1.3 网关:172.16.0.1
route add -host 192.168.1.3 gw 172.16.0.1 dev eth0
目标:192.168.0.0 网关:172.16.0.1
route add -net 192.168.0.0 netmask 255.255.255.0 gw 172.16.0.1 dev eth0
route add -net 192.168.0.0/24 gw 172.16.0.1 dev eth0
默认路由,网关:172.16.0.1
route add -net 0.0.0.0 netmask 0.0.0.0 gw 172.16.0.1
route add default gw 172.16.0.1
删除:route del
route del [-net|-host] target [gw Gw] [netmask Nm] [[dev] If]
目标:192.168.1.3 网关:172.16.0.1
route del -host 192.168.1.3
目标:192.168.0.0 网关:172.16.0.1
route del -net 192.168.0.0 netmask 255.255.255.0
ip - show / manipulate routing, devices, policy routing and tunnels
ip [ OPTIONS ] OBJECT { COMMAND | help }
OBJECT := { link | addr | route }
ip link - network device configuration
set dev IFACE
可设置属性:
up and down:激活或禁用指定接口
ifup/ifdown
show [dev IFACE]:指定接口
[up]:仅显示处于激活状态的接口
ip addr { add | del } IFADDR dev STRING
[label LABEL]:添加地址时指明网卡别名
[scope {global|link|host}]:指明作用域
global: 全局可用
link: 仅链接可用
host: 本机可用
[broadcast ADDRESS]:指明广播地址
ip addr add 172.16.100.100/16 dev eth0 label eth0:0
ip addr del 172.16.100.100/16 dev eth0 label eth0:0
ip address show - look at protocol addresses
[dev DEVICE]
[label PATTERN]
[primary and secondary]
ip addr flush 使用格式同show
ip addr flush dev eth0
ip route - routing table management
添加路由:ip route add
ip route add TARGET via GW dev IFACE src SOURCE_IP
TARGET:
主机路由:IP
网络路由:NETWORK/MASK
ip route add 192.168.0.0/24 via 172.16.0.1
ip route add 192.168.1.100 via 172.16.0.1
添加网关:ip route add default via GW dev IFACE
ip route add default via 172.16.0.1
删除路由:ip route del TARGET
显示路由:ip route show|list
清空路由表:ip route flush [dev IFACE] [via PREFIX]
ip route flush dev eth0
netstat [--tcp|-t] [--udp|-u] [--raw|-w] [--listening|-l] [--all|-a] [--
numeric|-n] [--extend|-e[--extend|-e]] [--program|-p]
-t: tcp协议相关
-u: udp协议相关
-w: raw socket相关
-l: 处于监听状态
-a: 所有状态
-n: 以数字显示IP和端口
-e:扩展格式
-p: 显示相关进程及PID
常用组合:
-tan, -uan, -tnl, -unl
显示路由表:
netstat {--route|-r} [--numeric|-n]
-r: 显示内核路由表
-n: 数字格式
显示接口统计数据:
netstat {--interfaces|-I|-i} [iface] [--all|-a] [--extend|-e] [--program|-p]
[--numeric|-n]
netstat -i
netstat –I=IFACE
ifconfig -s eth0
-t: tcp协议相关
-u: udp协议相关
-w: 裸套接字相关
-x:unix sock相关
-l: listen状态的连接
-a: 所有
-n: 数字格式
-p: 相关的程序及PID
-e: 扩展的信息
-m:内存用量
-o:计时器信息
FILTER : [ state TCP-STATE ] [ EXPRESSION ]
TCP的常见状态:(tcp finite state machine)
LISTEN: 监听
ESTABLISHED:已建立的连接
FIN_WAIT_2
SYN_SENT
SYN_RECV
CLOSED
EXPRESSION:
dport =
sport =
示例:'( dport = :ssh or sport = :ssh )'
常用组合:
-tan, -tanl, -tanlp, -uan
常见用法
ss -l 显示本地打开的所有端口
ss -pl 显示每个进程具体打开的socket
ss -t -a 显示所有tcp socket
ss -u -a 显示所有的UDP Socekt
ss -o state established '( dport = :ssh or sport = :ssh )' 显示所有已建立的ssh连接
ss -o state established '( dport = :http or sport = :http )' 显示所有已建立的HTTP连接
ss -s 列出当前socket详细信息
nmcli [ OPTIONS ] OBJECT { COMMAND | help }
device - show and manage network interfaces
nmcli device help
connection - start, stop, and manage network connections
nmcli connection help
修改IP地址等属性:
nmcli connection modify IFACE [+|-]setting.property value
setting.property:
ipv4.addresses
ipv4.gateway
ipv4.dns1 ipv4.method manual | auto
修改配置文件执行生效:systemctl restart network
nmcli con reload
nmcli命令生效: nmcli con down eth0 ;nmcli con up eth0
显示所有包括不活动连接
nmcli con show
显示所有活动连接
nmcli con show --active
显示网络连接配置
nmcli con show "System eth0"
显示设备状态
nmcli dev status
显示网络接口属性
nmcli dev show eth0
创建新连接default,IP自动通过dhcp获取
nmcli con add con-name default type Ethernet ifname eth0
删除连接
nmcli con del default
创建新连接static ,指定静态IP,不自动连接
nmcti con add con-name static ifname eth0 autoconnect no type Ethernet ipv4.addresses 172.25.X.10/24 ipv4.gateway 172.25.X.254
启用static连接配置
nmcli con up static
启用default连接配置
nmcli con up default
查看帮助
nmcli con add help
修改连接设置
nmcli con mod “static” connection.autoconnect no
nmcli con mod “static” ipv4.dns 172.25.X.254
nmcli con mod “static” +ipv4.dns 8.8.8.8
nmcli con mod “static” -ipv4.dns 8.8.8.8
nmcli con mod “static” ipv4.addresses “172.16.X.10/24 172.16.X.254”
nmcli con mod “static” +ipv4.addresses 10.10.10.10/16
DNS设置,存放在/etc/resolv.conf文件中
PEERDNS=no 表示当IP通过dhcp自动获取时,dns仍是手动设置,不自动获取
等价于下面命令:
nmcli con mod “system eth0” ipv4.ignore-auto-dns yes
修改连接配置后,需要重新加载配置
nmcli con reload
nmcli con down “system eth0” 可被自动激活
nmcli con up “system eth0”
nmcli dev dis eth0 禁用网卡,访止被自动激活
图形工具
nm-connection-editor
字符工具
nmtui
nmtui-connect
nmtui-edit
nmtui-hostname
Mode 0 (balance-rr) | 轮询(Round-robin)策略,从头到尾顺序的在每 一个slave接口上面发送数据包。本模式提供负载均衡和容错的能力 |
Mode 1 (active-backup) | 活动-备份(主备)策略,只有一个slave被激活,当且仅当活动的slave接口失败时才会激活其他slave.为了避免交换机发生混乱此时绑定的MAC地址只有一个外部端口上可见 |
Mode 3 (broadcast) | 广播策略,在所有的slave接口上传送所有的报文,提供容错能力 |
active-backup、balance-tlb 和 balance-alb 模式不需要交换机的任何特殊配置。其他绑定模式需要配置交换机以便整合链接。如:Cisco 交换机需要在模式 0、2 和 3 中使用 EtherChannel,但在模式4中需要LACP和EtherChannel |
/etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
BOOTPROTO=none
BONDING_OPTS="miimon=100 mode=0"
/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
USERCTL=no
/etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
USERCTL=no
查看bond0状态:/proc/net/bonding/bond0
miimon 是用来进行链路监测的。如果miimon=100,那么系统每100ms 监测
一次链路连接状态,如果有一条线路不通就转入另一条线路
删除bond0
ifconfig bond0 down
rmmod bonding
详细帮助:
/usr/share/doc/kernel-doc- version/Documentation/networking/bonding.txt
https://www.kernel.org/doc/Documentation/networking/bonding.txt
nmcli con add type bond con-name mybond0 ifname bond0 mode active-backup
nmcli con add type bond-slave ifname ens7 master bond0
nmcli con add type bond-slave ifname ens3 master bond0
nmcli con up bond-slave-eth0
nmcli con up bond-slave-eth1
nmcli con up mybond0
vim /etc/default/grub
GRUB_CMDLINE_LINUX="net.ifnames=0"
生效新的grub.cfg文件
grub-mkconfig -o /boot/grub/grub.cfg
reboot
官网文档:
https://help.ubuntu.com/lts/serverguide/network-configuration.html.zh-CN
配置自动获取IP
cat /etc/netplan/01-netcfg.yaml
network:
version: 2
renderer: networkd
ethernets:
ens33:
dhcp4: yes
修改网卡配置文件后需执行命令生效:netplan apply
配置静态IP:
cat /etc/netplan/01-netcfg.yaml
network:
version: 2
renderer: networkd
ethernets:
eth0:
addresses:
- 192.168.6.10/24
- 10.10.10.10/24
gateway4: 192.168.6.1
nameservers:
search: [mydomain, otherdomain]
addresses: [223.5.5.5, 8.8.8.8, 1.1.1.1]
ip addr
route -n
查看DNS
ls -l /etc/resolv.conf
lrwxrwxrwx 1 root root 39 Dec 12 11:36 /etc/resolv.conf -> ../run/systemd/resolve/stub-resolv.conf
systemd-resolve --status
修改主机名
hostnamectl set-hostname ubuntu1904
man hostname
man ping
man traceroute
man tracepath
man mtr
man nslookup
man host
man dig
当目的主机收到一个以太网数据帧时,数据就开始从协议栈中由底向上升,同时去掉
各层协议加上的报文首部。每层协议盒都要去检查报文首部中的协议标识,以确定接收数据
的上层协议。这个过程称作分用(Demultiplexing) ↩︎
为了计算一份数据报的IP检验和,首先把检验和字段置为0。然后,对首部中每个16bit
进行二进制反码求和(整个首部看成是由一串16bit的字组成),结果存在检验和字段中。当
收到一份IP数据报后,同样对首部中每个16bit进行二进制反码的求和。由于接收方在计算过
程中包含了发送方存在首部中的检验和,因此,如果首部在传输过程中没有发生任何差错,
那么接收方计算的结果应该为全1。如果结果不是全1(即检验和错误),那么IP就丢弃收到的
数据报。但是不生成差错报文,由上层去发现丢失的数据报并进行重传。ICMP、IGMP、UDP和TCP
都采用相同的检验和算法,尽管TCP和UDP除了本身的首部和数据外,在IP首部中还包含不同的字段。
在RFC1071[Braden, Borman and Patridge 1988]中有 关于如何计算Internet检验和的实现技术。
由于路由器经常只修改TTL字段(减1),因此当路由器转发一份报文时可以增加它的检验和,而不需要对
IP整个首部进行重新计算。RFC1141[Mallory and Kullberg 1990]为此给出了一个很有效的方法。 ↩︎