TCP/IP协议栈:使用中的模型
OSI:开放系统互联参考模型,学习模型;
通信子网:
只是用来关注你的数据到底如何从A地送往B地;
资源子网:
主要是考虑传输的数据是如何被组织起来的;
MAC:media access control
MAC地址表
静态指定
动态学习:根据源地址学习;ttl值(time to live 生存周期)
网桥(bridge)与交换机(switch)
主要作用是用来分割两个独立网络的冲突域和并连接两个独立的网络;当在同一个网络中的两台主机进行通信时,所发出的电信号是不会被网桥传递到另一个网络中的;但是当两个不同的网络中的两台主机有通信需求时,网桥就会实现不同网络中的主机进行通信;那么网桥是怎么知道哪台主机是在哪个网络中呢?网桥内部有一个地址簿,这个地址簿通常我们将其称为MAC地址表,上面一一对应了哪一个主机在哪个接口上;当一个网络中的主机向另一个网络中的主机发送信号的时候,一定会带一个收信人,这个收信人一定是某一个具体的地址,因此,网桥根据那个收信人的地址来查看那个地址簿,当它发现自己收到信号的接口和目标主机都在同一个接口上,于是网桥就认为这个信号是不需要转发的,但是如果收到的这个信号来自于1号接口,当网桥一查表发现目标主机x在2号接口,于是网桥就将1号接口的数据发往2号接口;所以这个过程就叫做数据交换的过程,所以后来网桥就发展到了交换机;
有时候,一个网络中的主机发出的信号有可能是广播的,那么什么是广播呢?我发送的这个信号具体收件人不是网络中的任何一台主机;而是我们事先商定的一个任何人都能接收的地址,这个地址我们将其称之为广播地址,当48位的MAC全为1的时候就是广播地址,因此网络中的其中一台主机发一个信号,它的目标地址是48个1;那么这个时候在同一网络中的其他主机看到后,会认为自己是可以接收的;那么当网络中的所有主机都在发广播的时候,就会引起广播风暴;
那么为什么会有广播呢?同一网络中的两台主机要通信,那要怎么能知道对方是谁呢?假如一个网络中有4台主机,A B C D;当A要跟D通信的时候,A不知道D是谁啊;就会发一个广播去问,谁是D?当B和C收到消息后,一看不是找我的,就会将消息丢弃,当D收到消息后,一看是找我的,就会恢复一个信号,我是D;
但是当一个网络相当庞大的时候,在同一个局域网中的主机数量很多的时候,并且需要相互通信的时候,都会先发出广播;这时候整个网络体系中就会充斥着许多广播,一天啥也不干只在那广播了,从而影响正常的数据通信;那么这个时候,将一个大网分割成数个小网络,将同一个部门的主机放在一个小网络,这样就有效隔绝了广播风暴;
路由器
当将两个网桥利用路由器连接起来的时候,怎么实现两个不同网络之间的通信呢?这个时候就不会用到MAC通信了;当路由器将两个网络连通的时候,两个网络就会各有一个自己的网络号,两个网络之间通过网络号来通信,那么路由器是如何知道是哪个网络的呢?在其内部也有一个表,叫做路由表;
路由表
静态指定
动态学习:ospf BGP RIP
IP(Internet protocol)地址:
网络号+主机号;
IP地址分类:
A类:
第一段为网络号,后三段为主机号;
网络号:0 0000000—0 1111111; 1—127
网络数:126个,2^7;127被用作本地回环地址;
每个网络中的主机数量:2^24-2;
这个地方减2的原因是排除了全为0的地址,全0的表示网络地址,也就是网
网络自身;全1表示网络中的所有主机,也就是广播地址;
子网掩码:255.0.0.0;每一个通信的主机都会拿自己的掩码来跟自己的ip地址做与运算;并拿自己的掩码与对方的地址做与运算,1与任何数相与,都得任何数;0和任何数相与,都得0;所以子网掩码的作用就是用来与ip地址按位进行"与"运算,从而取出其网络地址;
私网地址:10.0.0.0 255.0.0.0
B类:
前两段为网络号,后两段为主机号;;
网络号:10 000000—10 111111 128—191
网络数:2^14
前两位不变,第一段可变化的有6位,加上第二段的8位;总共14位可变;
每个网络中的主机数量:2^16-2
默认子网掩码;255.255.255.0
私网地址:172.16.0.0—172.31.0.0
C类:
前三段为网络号,后一段为主机号;
网络号:110 00000—110 11111;192—223
网络数:2^21
前三位不变,第一段只有5位可变,加上后面两段16位;总共是21位可变;
主机数:2^8-2
默认子网掩码:255.255.255.0
D类:组播通信;
1110 0000—1110 1111;192—239
E类:科研;240—255
OS
多用户,多任务
多任务:多进程
当一台主机上有多个任务的时候,比如说一边聊QQ、一边听歌、一边在浏览网页;那么这个时候就不仅仅是主机跟主机之间通信了;就以QQ为例,当两台主机利用QQ进行互相通信时,当QQ消息过来之后,同时运行的有QQ、QQ音乐和浏览器,那么这三个进程到底谁来接收这个QQ消息呢?为什么说是进程通信呢?其实我们的计算机并不会处理报文,真正完成应用通信的、有生产能力的还是得靠应用工具;所以说主机A传过来的QQ报文到底由B主机的谁来接收呢?所以我们还要去标识每一个进程的地址;这也就意味着,对方的数据信号发送过去之后,对方的主机还要想办法去识别出与本地主机上的哪个进程进行通信;每一个进程的地址不可能跨越主机去使用,进程地址只是在当前主机范围内区别不同进程的,所以说只能再本地范围内使用;那么我们用来标识进程地址的时候,这些地址是不是固定的呢?
端口是用来标识本地主机上每一个进程的唯一的数字标识;是进程用于实现网络通信时的数字标识;
通信时,进程的数字标识是16bits的;也就是1—65535
1—1023:固定分配,而且只有管理员才有权限启用;
1024—4w:半固定
4w+:临时端口;
在server端:有一个固定且明确的地址,也就是说有一个固定的端口号;在client端并不需要一个明确且固定的地址,也就是说QQ消息出去的时候只要能出去就可以了,不用管是从哪个端口出去的,这个端口只是个临时的会变的端口;
因此,每一个进程的地址该如何去标识呢?
IP+Port,这就是一个(socket)套接字,这就说明了哪一个主机上的哪个端口;从而用来标识了用来通信的某个进程;
而套接字是由内核来提供的,对于linux主机来讲,系统启动起来之后,其实有两个层面,第一个层面叫内核空间,内核自己的线程运行的空间;另外一个空间叫做用户空间,也就是你的各进程运行的空间;TCP/IP协议栈就在内核空间里面,其中TCP/IP所分成的资源子网和通信子网,其中通信子网就是由内核实现的,而资源子网则是由用户空间来实现的,资源子网说白了就是运行在用户空间的各客户端进程;而内核中的TCP/IP协议栈它只负责数据能从A主机的进程送到B主机的进程就行了;至于这个进程如何理解这个数据那是由资源子网中的进程来负责实现对的;
那么端口是由谁提供的呢?每一个进程启动起来要想能够完成网络通信,它要向内核注册申请使用端口,就对内核说我要使用某某端口,如果说这个端口没有被其他进程使用,内核就可以分给它使用,否则会造成端口冲突;一个端口在某一时刻只能被一个进程所使用;这个注册过程就被称为注册套接字的过程;
我们真正完成一次通信需要3个地址,MAC地址用来实现本地通信,当跨网络之后使用IP地址进行通信;端口号用来实现进程通信;
OSI七层模型 学习模型
物理层:
用来定义各设备的物理规范,
数据链路层:
用来定义mac地址通信时数据报文封装和响应方式
网络层:
基于IP地址的通信过程实现;
传输层:
定义基于端口的用来标识主机与主机之间的进程的通信;
会话层;
建立会话,完成通信;
表示层:
用来实现数据的表示格式,比如数据要不要压缩,要不要加密;
应用层:
如何实现真正资源交换;
TCP/IP模型 实际应用模型
物理层 以太网帧
以太网帧:MTU最大传输单元,现在最常用的是1500字节,在互联网上传送数据,比如说1G大小的电影,它在传送的时候是被拆分成大小为小于等于1500字节的小块来传送的,在数据传送期间即便是出现了错误,我们也只需要传送有问题的那部分;
互联网层 IP报文
传输层 TCP UDP
应用层 http https ftp ldap
信息报文传输流程:
主机A收到数据报文以后,先不考虑应用层首部;
首先封装传输层首部,端口是A主机进程的端口,目标端口是B主机进程的端口;
封装ip层首部,P层首部需要封装的是源IP是主机A的IP,目标IP是主机B的IP;
封装帧首部,源mac是A主机网卡的mac地址,目标mac是R1的1接口的mac;R1收到报文后发现,目标mac是自己,就会将报文拆开,看到目标ip和源ip,发现目标ip跟自己没有关系,就会将报文从R1的2号接口发送给R2的2号接口,在这个过程中这个报文会被重新封装一次帧,源mac是R1的2接口的mac,目标mac是R2的2接口的mac;当R2发现目标mac是自己的,就会将报文拆开,看到的依然是传输层首部和ip首部,发现目标ip跟自己没有关系,任然会将报文向下转发,所以说R2通过自己的路由表发现,它依然要将报文通过自己的1号接口发送给B,因此再封装一次帧,源mac是R2的1接口的mac,目标mac是主机B的网卡mac;
这时候会发现,源mac和目标mac是会被一次又一次的封装和解封装的,但是ip层首部和传输层首部是不会变化的;
这时候有一个问题,当A主机和B主机通信的时候,A主机凭什么知道要将报文发给R1的1号接口呢?这时候就用到网关了;
所有的非本地网络通信,也就是说我们的源地址和目标地址通过掩码计算后网络号不相同,则是非本地网络通信;如果网络号不相同,则两个网络通信的时候必须要由路由器向外转发才行,所以,当非本地网络通信的两个主机需要通信时,都需要一个总代理来将报文发给路由器,而网关就充当了这个总代理的角色;本地网络通信是不需要网关的;
ARP地址解析协议
当在同一网内的两台主机通信时,虽然都是用的ip地址通信,但是最终还是用mac地址来通信的,当主机A与主机B有通信需求时,先发广播,IP地址1.1.1.1对应的mac地址是什么?ip地址不是1.1.1.1的主机都会将该广播丢弃,只有主机B会回应,1.1.1.1对应的mac地址是多少;然后主机A就会将报文封装一个帧,包含源mac和目标mac传给B;
TTL生存周期
这时候,主机A与主机B已经建立了连接,但是不能每次通信都发广播,所以就会有一个ttl值,在这个时间范围内通信,主机A是不需要发广播的,直接就会将报文发给B,但是如果第一次通信的时间与第二次通信的时间的时间间隔超过了ttl规定的时间,那么A与B通信时,就会重新广播;
ARP通告
那么这时候,问题又来了,假如ttl值设定为5min,在这5min内,主机B的mac地址变了在这第1min的时候变了,但是mac地址表5min后才会更新,也就意味着主机A与B通信需要等4min才能通信,为了解决这个问题,就有了ARP通告这个功能,意思就是说:当一个旧主机的新mac需要接入该局域网时,这个新的mac地址需要向局域网内的所有主机进行一个通知,告诉所有的主机我的mac地址变了,并且新的mac地址是多少;这就是ARP通告;这样就完美解决了,当在ttl值内mac变化导致通信受阻的问题;
linux网络属性配置
ifconfig 命令的用法
-a 显示所有网卡,包括非激活(inactive)状态的;
ifconfig 网卡名 IP/MASK [up] 临时给网卡指定ip地址,如果网卡未激活可以跟
上up参数;
或者
ifconfig 网卡名 netmask MASK [up]
使用命令的配置方式是立即送往内核中的TCP/IP协议栈中的,并且是立即生效;
路由查看及管理
路由条目类型:
主机路由:目标地址为单个IP;
网络路由:目标地址为整个IP网络;
默认路由:目标为任意主机;0.0.0.0/0.0.0.0
route命令
-n 以数字格式显示路由表,不需要反解地址和端口号;
destination 目的地址
gateway 下一跳地址
如果gateway是0.0.0.0,表示本地主机就在网络上,不需要网关;直连路由;
genmask 目标网络的掩码
flags 表示状态
U表示up;
UG表示gateway。他是个网关
metric 度量值,表示到达该网络所要经过的开销
iface 表示从哪块网卡出去
上图表示,到达192.168.100.0网络就需要经过eth0网卡;
添加路由条目
route add [-net|-host] target [netmask MASK] [gw Gw][dev] If]
示例:route add -net 10.0.0./8 gw 192.168.100.1
添加ipv6默认路由:route -n -A inet6 add default gw 2409:8c3c:900:100::1
表示,如果报文是到达10.0.0.0网络的,就从192.168.100.1这走,经过的网卡是eth0;
添加默认网关:route add -net 0.0.0.0/0.0.0.0 gw 192.168.100.1 dev eth1 或者
route add default gw 192.168.100.1
删除路由条目
route del [-net|-host] target [gw Gw] [netmask Nm]
示例:
route del -net 10.0.0.0/8
netstat命令
显示路由:netstat -rn
-r 显示内核路由表
-n 以数字格式显示IP和port
-p 显示相关的进程及ID
显示网络连接
netstat [--tcp|-t] [--udp|-u]
-l 显示监听状态的连接
-a 显示所有状态的连接
传输层协议:
tcp:面向连接的协议,通信开始之前,要建立一个虚链路,在此虚链路的基础上进行通信;通信完成后还要拆除连接;跟打电话的方式类似;
udp:无连接的协议;无需建立虚链路,直接发送数据报文;无需关心对方什么状态;跟邮局发信件相似;
显示接口的相关数据
netstat {--interfaces|-I|-i} [iface] [--all|-a] [--extend|-e] [--verbose|-v] [--program|-p] [--numeric|-n]
配置DNS 服务器指向
配置文件 /etc/resolv.conf
对于linux主机来讲最多只能有3台主机作为dns服务器;
主机hosts文件的使用
/etc/hosts
192.168.100.2这台主机可以有多个别名;当我去pingwww.zhangzhide.com的时候是直接可以ping通的;
当在域名解析时,如果hosts文件跟dns服务器冲突了,生效的是hosts文件,因为主机是先找hosts文件的;
用来实现路由管理的命令
ip route
ip route add 添加路由
ip route add TYPE PREFIX via GW [dev IFACE] [src]
src 指定源地址,当一个主机有多个地址时,src才有意义;
示例:ip route add 192.168.0.0/24 via 10.0.0.1 dev eth1
表示当报文的目的地址是192.168.0.0/24这个网段时,将从10.0.0.1出去, 从eth1网卡出去;
添加默路由
ip route add default via 172.16.0.1 dev eth0
ip route change 修改路由
ip route show 显示路由
ip route flush 清空路由表
ip route get 获取单个路由
ip route delete 删除路由
示例:ip route delete 192.168.1.0/24
TCP的常见状态:
LISTEN 监听
ESTABLISEHD 建立的连接,双方处于正常的收发数据
FIN_WAIT1:一方提出断开连接,等待对方回应
FIN_WAIT2:另一方确认断开
SYN_SENT:断开连接
SYN_RECV:
CLOSED:
通过修改配置文件来配置网络属性:
路由相关的配置文件:/etc/sysconfig/network-scripts/route-IFACE
ifcfg-IFACE配置文件的参数:
DEVICE:此配置文件对应的设备名称
ONBOOT:在系统引导过程中,是否激活此接口
UUID:此设备的唯一标识
BOOTPROTO:激活此接口时使用什么协议来配置接口属性,常用的有dhcp、bootp、static、 none
TYPE:接口类型,常见的接口类型有Ethernet ;Bridge(桥接)
DOMAIN:DNS搜索域
GATEWAY:默认网关
IPADDR:IP地址
PREFIX/NETMASK:子网掩码
USERCTL:是否允许普通用户控制此设备
PEERDNS:如果BOOTPROTO的值为dhcp,是否允许dhcp-server分配的dns服务器指向覆盖本地手动指定的dns服务器指向,默认为允许;
NM_CONTROLLED:是否使用NetworkManager服务来控制接口;
网络服务有两个:
network
NetworkManager 这个在CentOS6上还不完善,但是在CentOS7上很完善了
路由配置文件
如果想将手动指定的非默认网关路由时,并且想永久有效时,需要编辑配置文件
/etc/sysconfig/network-scripts/route-IFACE
支持两种配置方式,但不可混用;
1、每行一个路由条目
目标地址 via GW
2、每3行一个路由条目
ADDRESS#=目标地址
NETMASK#=目标地址的掩码
GATEWAY#=下一跳
这两种方式都可以实现配置路由条目,但是不能混用;
配置策略路由:
1、/etc/iproute2/rt_tables里面定义名称 2、配置策略:【确保链路直接通】 ip route flush table manage ip route add default via 188.4.72.1 table manage ip rule add from 188.4.72.141 table manage
或者编辑/etc/sysconfig/static-routes
any net 188.0.0.0/8 gw 188.4.72.1
any net 10.0.0.0/8 gw 188.4.72.1
目的ip为:188.0.0.0/8和10.0.0.0/8下一跳:188.4.72.1
然后重启网卡即可生效,应用场景为当一台服务器上需要配置两个ip地址,并且需要配置两个网关,而其中一个网关不能写在ifcfg-eth0配置文件当中时可用此方法;
Ipv6
2. 可以编辑或添加vi /etc/sysconfig/static-routes-ipv6:
#Device IPv6 network to route IPv6 gateway address
eth0 fec0:0:0:2::/64 fec0:0:0:1:0:0:0:20
eth0 2000::/3 3ffe:ffff:0000:f102:0:0:0:1
来源:https://www.cnblogs.com/zhangzhide/p/12640360.html