网络
OSI(国际标准化组织网络的定义,开放系统互联) ISO(国际标准化组织)
OSI网络模型分层
下层为上层提供服务
7 应用层(application):一系列应用软件
6 表示层(presention):格式化数据,加密,压缩等
5 会话层(session):建立、管理和终结会话
4 传输层(transport):实现数据的传输,链路,终端对终端之间的传输
链路:同一网段互相访问
终端对终端:跨网络互相访问
3 网络层(network):定义了逻辑地址(IP地址),定义了路由功能,选择路径的过程叫做路由
2 数据链路层(data link):定义了物理地址,frame帧 有格式的若干个bit的组合,数据检测
1 物理层(physical):二进制传输,bit为传输单位0101
以太网帧2代的组成结构(数据链路层):
前导信息SOF
目标物理地址占6个字节
源物理地址占6个字节
类型指的是上层协议的类型,占2个字节
数据包长度56-1500
FCS占4个字节
以太网帧的最小值为46+8+6+6+2+4=72字节
以太网帧的最大值为1526字节
MAC地址一共有45位,前两位的第一位如果为1就是广播,第二位为1就说明是本地管理地址前22位是国际组织分配的标识符OUI,48位都是1则是广播,48位的二进制数组成
PDU:协议数据单元(报文)较大的数据拆分的包叫做报文
物理层的PDU是数据位 bit
数据链路层的PDU是数据帧frame
网络层的PDU是数据包packet
传输层的PDU是数据段segment
其他更高层次的PDU是消息message
交换机的工作原理
具有安全性,不会将接收包发送到同一冲突域的所有计算机,会拆分包进行分析,并在交换机内部类似于内存的位置储存源MAC和目标MAC的信息方便下一次两计算机通信,防止冲突域冲突,每个交换机的接口属于一个冲突域
vlan
相当于划分组,1组内部的计算机可以互相通信,但别的组的计算机无法与1组内部计算机互相通信
路由器
拥有路由表,在路由表上面选择良好路径进行通信,并且拥有隔离广播域,设置安全策略的功能,还可以连接广域网
TCP/IP协议
TCP:传输控制协议 IP:因特网互联协议
TCP/IP是一个协议栈,一个协议集合包括TCP、IP、UDP、ICMP、RIP、TELNET、FTP、SMTP、ARP等等
TCP/IP分为了四层
应用层
【相当于OSI的上三层;常见协议:FTP文件传输协议、TFTP轻量级文件传输协议、NFS、SMTP简单邮件传输协议、SNMP、DNS等多种协议】
传输层
【相当于OSI的传输层,终端对终端互相通讯,可能实现数据的可靠传输,当需要的时候可靠或者不可靠传输,面向连接的前提是要确保有交互有回应以及非面向连接】
传输层协议:TCP:面向连接的,可靠连接,发送的包有编号,拥有确认机制(收到包之后,会回应"我希望下次发包+1"的包)
UDP:用户数据包协议;非面向连接,性能好,效率高,但有可能不可靠,可能会丢包,而且收到的包按照先后顺序排列,发的包的 顺序与收到包的顺序可能不同,有可能会导致包混乱,也就是可能会损坏数据
TCP的报文头部
从0位表示第一位到第32位,一行相当于4个字节
源端口(在外层) 目标端口(在里层) 一共占32位4个字节
序号(不同的包的编号)
确认号(确认对方发送给自己的包,写的值是"包+1",从0开始编号的)
数据偏移(tcp报文头部的长度,由于tcp长度不确定,所以要在此处进行确定) 保留 标记位URG,ACK,PSH,RST,SYN,FIN 窗口(数据包传
输大小,每次传输数据最大能传输多大)
校验和(检查数据包完整性,将上方一系列组合起来做一个计算,对方收到后再做一个计算,查看是否相同) 紧急指针
选项(长度可变,就因为长度不固定所有数据偏移用来确认长度) 填充
标记位解答:(!!!为重点!)
URG:紧急指针位,紧急数据,如果为1则说明下层紧急指针有效,为0则说明紧急指针无效
!!!ACK:表示是否前面的确认号字段是否有效。ACK=1,表示有效。只有当ACK=1时,前面的确认号字段才有效。TCP规定,连接建立后, ACK必须为1,带ACK标志的TCP报文段称为确认报文段
PSH:当应用程序发来数据到达网卡后网卡会查看数据包是否为自己的mac的地址,是就接收,不是就丢弃,然后将数据传送到内核中的 Buffer中,如果PSH为1,将立即发送到应用中,如果为0,则会在Buffer中存放到Buffer满了传送给应用
RST:当应用程序网络通讯出现异常,要求对方与主机重新创建连接时,RST为1
!!!SYN:在建立连接时使用,用来同步序号。当SYN=1,ACK=0时,表示这是一个请求建立连接的报文段;当SYN=1,ACK=1时,表示对方 同意建立连接。SYN=1,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中SYN才置为1,带SYN标志的TCP 报文段称为同步报文段
!!!FIN:表示通知对方本端要关闭连接了,标记数据是否发送完毕。如果FIN=1,即告诉对方:“我的数据已经发送完毕,你可以释放连 接了”,带FIN标志的TCP报文段称为结束报文段
TCP三次握手:
1 客户端主动发送请求,服务器被动接受客户端请求,当客户端没有建立连接前,状态是CLOSED状态;
2 客户端会发送SYN=1,seq=x,发 送出去后状态就会变为SYN-SENT(同步发送)状态;
3 对方LISTEN收到请求后,会立即回应SYN=1,ACK=1,seq=y(服务器端的序号),ack=x+1(确认收到客户端发送的包,并且希望下一次发送x+1的包),状态就会变为SYN-RCVD(同步接收状态)
4 客户端收到服务端的回应后,会立即发送ACK=1,seq=x+1,ack=y+1,状态就会变为ESTAB-LISHED(建立连接状态)
TCP四次挥手(断开连接)
服务端与客户端都可以主动发起断开请求,此处描述客户端发起断开请求;
1 客户端状态为ESTAB-LISHED(建立连接),发起断开连接的请求包为FIN=1,seq=u,发出后会立刻变为FIN-WAIT-1(终止等待)状态
2 服务端收到请求后会立刻回应ACK=1(确认FIN的标记位收到)seq=v,ack=u+1;会从ESTAB-LISHED变为CLOSE-WAIT(关闭等待)状态,并且 还会继续传送客户端数据,客户端收到后会变为FIN-WAIT-2(终止等待2)状态
3 当数据完全传送完成后,服务器会发送FIN=1,ACK=1,seq=w,ack=u+1;发出后会从CLOSE-WAIT状态变为LAST-ACK(最后确认)状态
4 客户端收到后会从FIN-WAIT2变为TIME-WAIT(时间等待)状态,会等待2MSL时间,继续等待服务端发送所有的数据
5 客户端发送ACK=1,seq=u+1,ack=w+1后服务端与客户端会变为CLOSED状态
netstat -ntuap
nt:显示tcp的协议
nut:显示udp的协议
a:显示所有的协议
p:显示协议对应的应用程序
连接状态(根据TCP包头的标记位衍生出以下连接状态):
CLOSED 关闭状态,没有任何状态
LISTEN 监听状态,等待TCP端口的连接请求
SYN_SENT 在发送连接请求后等待确认
SYN_RECEIVED 在收到和发送了一个连接请求后,等待对方确认
ESTABLISHED 表示已建立连接,双方进入数据传输状态
FIN_WAIT1 主动关闭,主机已发送关闭连接请求,等待对方确认
FIN_WAIT2 主动关闭,主机已收到对方关闭确认,等待对方发送断开连接请求
TIME_WAIT 完成双向传输连接关闭,等待所有分组消失
CLOSE_WAIT 被动关闭,收到对方发来的断开连接请求,并已确认
LAST_ACK 被动关闭,等待最后一个断开传输连接确认,并等待所有分组消失
CLOSING 双方同时要断开传输连接,等待对方确认
注意:
1 处于FIN_WAIT_2状态的客户端(半关闭状态)如果迟迟收不到服务端发来的FIN=1请求则会成为孤儿连接
系统的处理方法:
内核中会定义孤儿连接的数量
/proc/sys/net/ipv4/tcp_max_orphans 指定内核能管理的孤儿连接数量
/proc/sys/net/ipv4/tcp_fin_timeout 指定孤儿连接在内核中生存的时间
2 当客户端发送的请求,服务器端无法接收数据的时候则会出现重传
/proc/sys/net/ipv4/tcp_retries1 重传最少次数,默认值为3
/proc/sys/net/ipv4/tcp_retries2 重传最多次数,默认值为15
TCP确认
每收到一个包就会确认一遍,这样来说虽然安全性有所提高,但是会影响效率,而每次确认的ACK一般都是+1并且是通过TCP头部中的窗口定义的;
TCP变化窗口,滑动窗口;
每次发送数据包的大小是不确定的,发送包方不知道接收方能接收几个,会尝试发送多个包测试,而接收方会告诉发送方窗口大小
UTP包头
16位源端口 16位目标端口
16位UDP报文长度 16位的UDP校验位
数据
端口号:表示了上层协议的类型,每个应用都有独立的端口号,一个应用程序可以使用多个端口号,而一个端口只能给一个应用使用
以下为常用服务器端端口
http:tcp 80
https:tcp 443
dns:tcp 53、udp 53
ftp:tcp 21
ssh:tcp 22
telnet:tcp 23
/etc/services中储存了许多常用的一系列端口
而客户端的端口号是随机分配的
0-1023:只有管理员才有资格使用
1024-49151:普通用户可以使用
49152-65535:随机匹配给客户端的端口号
从应用层往下会添加每一层的首部信息,传输层如果是TCP则要添加TCP的首部,再往下网络层的首部,这样TCP首部就成为了网络层的数据继续向下添加下层的首部
Internet层
(相当于OSI的网络层)
网络访问层(相当于OSI的数据链路层以及网络层)
IP协议
ICMP协议(ping命令)/proc/sys/net/ipv4/icmp_echo_ignore_all(存放0或1就是是否忽略ping的回应,0是不忽略,1是忽略)
ping -c1(ping一次)
-W1(缩短延迟时间,1秒ping不同就回复结果)
-s 3000(指定发送的数据包大小,包最大65507)
-f (不管对方是否回应,持续发送数据包,大量发包消耗对方资源)
type为8是请求包,type为0是回应包
Linux默认的ttl为64
IGMP协议(Internet组管理协议):对于老版windows系统来说,发送IGMP数据包过多就容易死机
ARP协议(地址解析协议):负责把IP地址解析为MAC地址,也就是利用IP地址查找到对方mac地址,工作在局域网
arp -n(查看arp表)
arp -d "要清除的IP地址"
arping -I ["从某个网卡出"] "目标IP地址"(可发现网络中是否存在冲突)
ip neigh也可以查看arp表
两台主机访问过程:
当A主机要与B主机建立通讯时,首先发送SYN同步,建立在TCP/IP协议上,然后清楚对方IP但不知道MAC地址,所以使用到ARP协议广播从而获得对方mac地址,数据包通过物理层0101的方式发送到B主机,B主机查看到时广播所以要接收此包,发现对方查找的是自己IP地址对应的mac所以进行回应,因为带有源mac地址,所以也将A主机的IP和MAC添加到arp表中,B主机进行回应,目标Mac,源Mac,ARP回应包;经过物理层0101的方式回应给A主机,A主机收到B主机的Mac地址,ARP工作就完成了,A主机就会记录B主机的MAC地址与IP地址到ARP表中,然后A主机将数据包补全,当中包括"目标MAC--源MAC--源IP--目标IP--TCP SYN",再次经过物理层010101发送到B主机,B主机依次拆分发现是SYN同步位,B主机回复ACK1 SYN1,A主机再次依次解封装,A主机解析后,再次发送ACK1,三次握手建立完成,A主机发送数据,经过每一层都要添加每一层的报头,之后B主机收到解封装后再次回复A主机收到数据包希望下次发送x包
在广域网发送ARP广播的步骤
请求主机:A
目标主机:B
当A主机想要与B主机进行通讯的话,清楚了B主机的IP地址,但是ARP广播是不支持隔段广播的,所以A主机就要发送广播在局域网,那么A主机接口的路由器的网关就会回应,A主机的ARP表中就会添加目标mac是A主机,将数据包发送给路由器,然后路由器再次将A主机发送来的数据包从另一个口转发给主机B,B主机的ARP表则记录的目标MAC则是B主机连接的路由器接口的网关
反向ARP:将MAC地址解析为IP地址
IP PDU报头
0-3位:存放版本号(主流ipv4,推广中ipv6)
4-8位:首部长度决定首部多长,因为下方有一块的长度是可变化的
8-16位:区分服务,特定情况下使用
16-31位:总长度是所有数据包加首部加数据总长度
0-8位:生存时间,ttl默认为64
8-16位:协议,显示的是上层协议的类型
0-23位:可选字段(长度可变)
24-31位:首部校验和
0-16位:标识表示数据来自于哪一个包,标识一样的则说明来自于同一个包
16-19位:标志,表示包是否为分片包,只有后两位有意义,DF,中间的一位,只有当DF=0时才允许分片,不允许分片就说明 数据就来自于一个包;MF,最高位,MF=1表示后方还有分片,MF=0则表示为最后一个分片
19-31位:片偏移用来表示在大包中的第几片
0-31位:存放源地址,目标地址,采用32位的二进制数
TCP的协议类型为6,UDP位17,在/etc/protocols中可以查看
MTU:最大传输数据单元
IP地址:
可以手工指定,具备管理性
IP地址由两部分组成:
网络ID:
172.18.X.Y(172.18就属于网络ID,标识在哪一个网段)
主机ID:
标识单个主机(X.Y代表网络中的某个单个的主机)
ipv4:32位=前面若干位为网络为+后面的位主机ID位
网络ID=IP与子网掩码
IP地址分类
A类
0前8位为网络ID.X.Y.Z 剩下的则为主机ID,24位的主机ID,并且最高位为0
0-127.X.Y.Z 开头则为网络ID,可用的网络ID为1-126也就是126个
1-126.X.Y.Z为A类地址
一个网段中的主机数=2^主机ID位-2(去掉全位0的和全位1的) 16777214
网段数=2^可变的网络ID位7位
子网掩码:255.0.0.0
B类:
一个B类网段中主机数=2^16-2 65534
B类网段数=2^14 16384
10前16位为网络ID.Y.Z(10两位不可变)
128-191.X.Y.Z为B类地址
255.255.0.0
C类:
一个C类网段中主机数=2^8-2 254
C类网段数=2^21
110前24位是网络ID.X.Y.Z
192-223.X.Y.Z表示C类地址
255.255.255.0
#D类:表示多播地址
CIDR:无类域间路由,网络ID不按照整8位划分,按需求划分
CIDR表示法:IP/网络ID位数
子网掩码:32位二进制数,前面位是1,后面的位为0,1的位对应表示网络位,0对应的位表示主机ID位30位的网络ID,主机数就为2^2-2=2
网络ID位以及主机ID位都需要子网掩码进行判断
1=2^0=1
10=2^1=2
100=2^2=4
1000=8
10000=16
100000=32
1000000=64
10000000=2^7=128
00000000 0
10000000 128
11000000 192
11100000 224
11110000 240
11111000 248
11111100 252
11111110 254
11111111 255
公共IP地址(在互联网上使用,需要申请,分配完成后并且是世界唯一的)
私有IP地址(在互联网上不会分配,永久保留,内部局域网使用)
A类:10.0.0.1到10.255.255.254
B类:172.16.0.1到172.31.255.255
C类:192.168.0.0到192.168.255.255
特殊地址
0.0.0.0:所有不清楚的主机和目标网络
255.255.255.255:广播地址
127.0.0.1-127.255.255.254:本地回环地址
224.0.0.0-239.255.255.255:多播地址
169.254.x.x(Windows):如果网络中不存在DHCP服务器,那么获取到的就为169.254.x.x后面是随机分配的,获取之后也可以进行访问
可变长度的子网掩码
主机ID位多称为大网,主机ID位少称为小王
子网划分:将一个大的网络切割为多个小的网络,网络ID位向主机ID借位,网络ID位增多,主机ID变少
划分子网的数量=2^网络ID向主机ID借位的位数
路由表:
跨网络通信:路由
路由分类:
主机路由:具体体现出到达某一个IP主机的路径
网络路由:到达到一个网段的路径对应
默认路由:当目标所在位置网段过多或路由表中没有记录的时候都会走默认路由,默认路由,0.0.0.0,通常默认路由是配在互联网的边界位置
优先级:精确度越高,优先级越高
路由表构成
1 网络ID netmask:目标主机所在的网段
2 接口interface:发送数据包到目标网段的出口
3 网关gateway:到达非直连网络时,将数据包发送到下一个路由器邻近我的接口的IP
动态主机配置协议DHCP:使客户端可自动获取IP地址;
客户端发送通过广播方式发送discover报文;
DHCP服务器会单播回应客户端offer;
客户端收到offer后会通过广播再次发送一个request请求;
DHCP服务端会单播发送详细信息给客户端ACK,结束交换过程;
DHCP服务端使用的是UDP的67端口;
DHCP客户端使用的是UDP的68端口;
基本网络配置
将Linux主机接入到网络,需要配置网络
一般包括如下内容:
主机名
ip/netmask
路由:默认网关
DNS服务器:域名解析
能添加多个DNS地址
/etc/hosts中存放的是IP地址与主机名的对应关系
Centos 6网卡名称
以太网:eth[0,1,2,...]
ppp:ppp[0,1,2,....]
定义了网络接口的命名方式:/etc/udev/rules.d/70-persistent-net.rules,可在此文件中修改网卡名称,修改后不会立即生效,使用以下方法生效
ethtool -i "网卡名" (查看网卡对应的驱动是什么)
modprobe -r e1000(首先卸载网卡驱动)
modprobe e1000(加载网卡驱动)
上述操作完成后就可以更新网卡名称了
当在图形界面没有办法重新启动网卡服务的时候将NetworkManager禁用重试
网络配置方式:
ifconfig命令:
(ifconfig)(ip a)(ip link):默认用来显示网卡的信息,显示的是活动网卡的信息,当网卡状态down的时候则看不到,添加-a选项可以查看所有;
ifconfig "网卡名" down 将网卡彻底down掉
ifconfig "网卡名" up 启动网卡
ifconfig "网卡名" "IP/netmask":临时在网卡上添加IP地址,网卡down了后再启动IP就没有了
ifconfig "网卡名:数字" "IP/netmask":给网卡起别名,同时给设备配置IP地址,相当于在一个设备上配置多个IP地址,也是临时性的
ifconfig -s "网卡名" 查看网卡上数据包通讯的统计信息,(MTU:大小;RX-OK:接收成功;RX-ERR:接收错误)
当使用ifdown和ifup命令的时候,网卡必须要存在配置文件
ip{a,link,route}
setup 蓝色背景字符界面配置
启用混杂模式(相当于抓包,接收所有的数据包,分析数据包,窃听使用):[-]promisc
route命令,但现在推荐使用ip route
路由管理命令
查看:route -n
添加:route add
主机路由添加方法:route add -host "目标主机IP地址" gw "网关" dev "接口"
网络路由添加方法:route add -net "目标网段/子网掩码" gw "网关" dev "接口"
默认路由添加方法:route add -net 0.0.0.0/0 gw "网关"
删除:route del
删除主机路由方法:route del -host "目标主机IP地址"
删除网络路由方法:route del -net "目标网段/子网掩码"
删除默认路由方法:route del -net 0.0.0.0/0
直连网络的路由在路由表中默认存在
netstat命令
默认显示的包括一系列与网络相关的文件,节点号,类型;DGRAM代表UDP协议;STREAM代表TCP协议
netstat -nltup 这种搭配比较常用,查看当前服务器端上正在使用的应用程序;
netstat -ntu 显示当前正在建立连接状态的主机
-n:以数字显示IP和端口
-l:显示当前主机监听哪些端口
-t:显示tcp协议
-u:显示udp协议
-p:显示应用名称
-a:所有状态
-e:扩展信息