linux基础网络知识
1、简述osi七层模型和TCP/IP五层模型
1.1、OSI七层模型各层定义
- 物理层:提供为建立、维护和拆除物理链路所需要的机械的、电气的、功能的和规程的特性;有关的物理链路上传输非结构的位流以及故障检测指示。
- 数据链路层:在网络层实体间提供数据发送和接收的功能和过程;提供数据链路的流控。
- 网络层:控制分组传送系统的操作、路由选择、拥护控制、网络互连等功能,它的作用是将具体的物理传送对高层透明。
- 传输层:提供建立、维护和拆除传送连接的功能;选择网络层提供最合适的服务;在系统之间提供可靠的透明的数据传送,提供端到端的错误恢复和流量控制。
- 会话层:提供两进程之间建立、维护和结束会话连接的功能;提供交互会话的管理功能,如三种数据流方向的控制,即一路交互、两路交替和两路同时会话模式 。
- 表示层:代表应用进程协商数据表示;完成数据转换、格式化和文本压缩。
- 应用层:提供OSI用户服务,例如事务处理程序、文件传送协议和网络管理等。
1.2、TCP/IP五层各层定义(目前主流使用)
1)、物理层:主要是基于电器特性发送高低电压(电信号),高电压对应数字1,低电压对应数字0
2)、数据链路层 :建立逻辑连接、进行硬件地址寻址、差错校验等功能(由底层网络定义协议)。并且将比特组合成字节进而组合成帧,用MAC地址访问介质,错误发现但不能纠正。
- 以广播的方式通讯
- 以太网协议:早期的时候各个公司都有自己的分组方式,后来形成了统一的标准,即以太网协议ethernet
- mac地址:head中包含的源和目标地址由来:ethernet规定接入internet的设备都必须具备网卡,发送端和接收端的地址便是指网卡的地址,即mac地址mac地址:每块网卡出厂时都被烧制上一个世界唯一的mac地址,长度为48位2进制,通常由12位16进制数表示(前六位是厂商编号,后六位是流水线号)
3)、网络层 :引入一套新的地址用来区分不同的广播域/子网,这套地址即网络地址,进行逻辑地址寻址,实现不同网络之间的路径选择。
- 协议有:IP(IPV4 IPV6) ARP RARP ICMP IGMP
- IP协议:规定网络地址的协议叫ip协议,它定义的地址称之为ip地址,广泛采用的v4版本即ipv4,它规定网络地址由32位2进制表示范围0.0.0.0-255.255.255.255
- 一个ip地址通常写成四段十进制数,例:192.168.10.1
- IP协议的作用主要有两个,一个是为每一台计算机分配IP地址,另一个是确定哪些地址在同一个子网络(配合子网掩码)。
4)、传输层 :定义传输数据的协议端口号,以及流控和差错校验。 协议有:TCP UDP,数据包一旦离开网卡即进入网络传输层 封装的数据格式
5)、应用层 :规定应用程序的数据格式,网络服务与最终用户的一个接口。 协议有:HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP
1.3七层模型通信流程
2、总结描述TCP三次握手四次挥手
2.1 TCP标志位,有6种标示:
ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急) SYN(synchronous建立联机) Sequence Number(顺序号码) Acknowledge Number(确认号码)
2.2 三次握手
这是 TCP 建立连接的特殊情况,有时会出现两台机器同时执行主动打开的情况,不过概率非常小,这种情况大家仅作了解即可。在这种情况下就无所谓发送方和接收方了,双放都可以称为客户端和服务器,同时打开的过程如下:
2.3四次挥手
建立一个连接需要三次握手,而终止一个连接要经过 4次握手。这由 TCP 的半关闭( half-close) 造成的。既然一个 TCP 连接是全双工 (即数据在两个方向上能同时传递), 因此每个方向必须单独地进行关闭。这原则就是当一方完成它的数据发送任务后就能发送一个 FIN 来终止这个方向连接。当一端收到一个 FIN,它必须通知应用层另一端已经终止了数据传送。理论上客户端和服务器都可以发起主动关闭,但是更多的情况下是客户端主动发起。
常见面试题
【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
【问题2】为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。在Client发送出最后的ACK回复,但该ACK可能丢失。Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。
【问题3】为什么不能用两次握手进行连接?
答:3次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。
现在把三次握手改成仅需要两次握手,死锁是可能发生的。作为例子,考虑计算机S和C之间的通信,假定C给S发送一个连接请求分组,S收到了这个分组,并发 送了确认应答分组。按照两次握手的协定,S认为连接已经成功地建立了,可以开始发送数据分组。可是,C在S的应答分组在传输中被丢失的情况下,将不知道S 是否已准备好,不知道S建立什么样的序列号,C甚至怀疑S是否收到自己的连接请求分组。在这种情况下,C认为连接还未建立成功,将忽略S发来的任何数据分 组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。
【问题4】如果已经建立了连接,但是客户端突然出现故障了怎么办?
TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。
3、描述TCP和UDP区别
TCP/IP协议是一个协议簇。里面包括很多协议的,UDP只是其中的一个, 之所以命名为TCP/IP协议,因为TCP、IP协议是两个很重要的协议,就用他两命名了。
TCP/IP协议集包括应用层,传输层,网络层,网络访问层。
TCP的包头结构:
源端口 16位;
目标端口 16位;
序列号 32位;
回应序号 32位;
TCP头长度 4位;
reserved 6位;
控制代码 6位;
窗口大小 16位;
偏移量 16位;
校验和 16位;
选项 32位(可选);
这样我们得出了TCP包头的最小长度,为20字节。
UDP的包头结构:
源端口 16位
目的端口 16位
长度 16位
校验和 16位
1、基于连接与无连接;
2、对系统资源的要求(TCP较多,UDP少);
3、UDP程序结构较简单;
4、流模式与数据报模式 ;
5、TCP保证数据正确性,UDP可能丢包;
6、TCP保证数据顺序,UDP不保证。
4、总结ip分类以及每个分类可以分配的IP数量
-
A类地址
以0开头的地址,子网掩码为8位,范围:0.0.0.0-127.255.255.255,网络数量126(不能是0和127),可分配的ip数量2^24-2,私有地址10.0.0.0/8
-
B类地址
以10开头的地址,子网掩码为16位,范围:128.0.0.0-191.255.255.255,网络数量214,可分配的ip数量216-2,私有地址172.16.0.0/12
-
C类地址
以110开头的地址,子网掩码为24位,范围:192.0.0.0-223.255.255.255,网络数量2^21,可分配的ip数量254,私有地址192.168.0.0/16
-
D类地址
以1110开头的地址,组播地址,范围:224.0.0.0-239.255.255.255
-
E类地址
以1111开头的地址,为保留地址
5、总结IP配置方法
1)、Ifconfig命令**
第一种使用ifconfig命令配置网卡的ip地址。此命令通常用来零时的测试用,计算机启动后,ip地址的配置将自动失效。具体用法如下:
Ifconfig ethx ipaddr netmask x.x.x.x
注意:此方法配置的ip地址后计算机从新启动将会失效。
2)、nmcli 命令
[23:08:48 root@centos7 data]#nmcli connection add type ethernet con-name eth3 ifname eth1
[23:10:03 root@centos7 data]#nmcli connection modify eth3 ipv4.addresses 192.168.1.135/24
[23:11:16 root@centos7 data]#nmcli connection modify eth3 ipv4.method manual ipv4.gateway 192.168.1.1 ipv4.dns 223.5.5.5
[23:12:33 root@centos7 data]#nmcli connection show
NAME UUID TYPE DEVICE
eth0 5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03 ethernet eth0
virbr0 1544fc04-8ea9-4db2-ad80-01e7469cb8cc bridge virbr0
eth3 2de21499-0f01-4c0b-a585-49dafd4ead6c ethernet - eth1
3)、编辑配置文件
[23:12:38 root@centos7 data]#vim /etc/sysconfig/network-scripts/ifcfg-eth0
NAME=eth0 #用命令看到的名字
DEVICE=eth0 #设备名
ONBOOT=yes #网卡是否允许启动
BOOTPROTO=static #如果是dhcp 此处需要修改
TYPE=Ethernet #网络类型,以太网
IPADDR=192.168.44.130 #多个IP地址 需要加1 IPADDR1
PREFIX=24 #掩码 也可以写为 NETMASK 255.255.255.0
GATEWAY=192.168.44.2 #网关
dns1=192.168.1.1 #DNS 最多两个