Linux网络管理相关知识及问题

1、osi七层模型和TCP/IP五层模型

OSI七层和TCP/IP五层以及对应网络设备对比示例图

TCP/IP传输HTTP数据包流程图,加包和解包流程

图片摘自博客简述OSI七层模型和TCP/IP五层模型

OSI模型是由国际标准化组织(ISO提出),开放系统互联(Open Systems Interconnection)

OSI模型共有7层:

  • 1-4层是低层
  • 5-7层是高层
  • 由上到下本别是:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层

应用层:

是OSI模型的最高层,离物理硬件层次最远,也是最接近用户的层级,举个例子:音乐软件在应用层产生数据,也在应用层接收数据,发出数据时经过OSI各层才最后由网卡发出去

表示层:

提供数据转化类服务,数据如何展现,如何表示的功能。如格式转码,数据压缩数据加密等,就是在这层动作的

会话层:

为通信的产生建立会话,会话层在两个互相通信的应用进程之间建立,组织和协调其交互活动

传输层:

第一个端对端的传输控制层,通过指定端口找到对方主机上对应服务器程序,其本质是接收上一层的数据,必要时候将数据分割为更小的数据单元再传给网络层

传输层有两种协议:UDP和TCP协议,将根据协议的不同将其封装成数据报或者数据段

网络层:

将数据或数据段继续封装,加上源IP和目标IP成为数据包

因为有目标IP,更具路由规则,可以知道数据包怎么传递出去以及怎么找到目标主机,另外其拥有源IP使得对方主机回应时可以根据IP地址路由来回,让自己能收到对方的响应数据。

链路层:

将封装了的IP地址数据包继续封装,得到了数据帧:将源MAC地址和目标MAC地址加入到数据包中,得到了数据帧

需要通过物理链路上的设备来决定封装成何种格式的数据帧,如果是计算机与路由器或交换机之间的数据,那么会将MAC封装成以太网帧;如果是路由器与路由器之间,中间链路没有其他物理设备,那么无需加入物理层地址而是使用PPP点到点协议,所以路由器之间的数据帧是PPP协议帧。

路由器会根据解封数据帧将源MAC地址修改为自己的MAC地址,目标的MAC地址为路由器下一跳的目标地址,这样就通过不断修改目标MAC和源MAC数据到达目标主机上,也就最终能够得到相应数据。

补充:

PPP点对点协议

物理层:

数据最终是通过网卡出去的,数据帧进入物理层,网卡会将数据信号转变为电信号,传递给网线。通过网卡处理后的数据是二进制,称为bit位数据。

2、TCP三次握手四次挥手

什么是“三次握手,四次挥手”

TCP是一种面向连接的单播协议,在发送数据前,通讯双方必须在彼此之间建立一条连接,所谓的“连接”,其实是客户端和服务器的内存中保存的一份对方的信息,比如iP地址,端口号等。

TCP可以看成是一种字节流,他会处理IP层或以下层的丢包,重复以及错误的问题,在连接的建立过程中,双方需要交换一些连接参数,这些参数放在TCP头部

所以其采用三次握手的方式建立连接,采用四次挥手的方式断开连接

一个TCP连接由一个4元组构成,分别是两个IP地址和两个端口号,一个TCP连接通常分为三个阶段:启动,传输数据,退出

当TCP接收到另一端的数据时,他会发送一个确认,但这个确认不会立即发送,一般会有延迟

一个完整的TCP连接是双向和对称的,数据可以在两个方向平等地流动,给上层应用程序提供一种双工服务,一旦建立了一个连接,这个连接的一个方向上的每一个TCP报文段都包含了相反方向上的报文段的一个ACK

补充:TCP头部

img

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RrBHMD66-1586216010166)(https://i.loli.net/2019/06/21/5d0c331c5378f22175.jpg)]

补充:

  • 来源连接端口(16位长)-识别发送连接端口
  • 目的连接端口(16位长)-识别接收连接端口
  • 序列号(seq,32位长)
  • 如果含有同步化旗标(SYN),则此为最初的序列号;第一个数据比特的序列码为本序列号加一。
  • 如果没有同步化旗标(SYN),则此为第一个数据比特的序列码。
  • 确认号(ack,32位长)—期望收到的数据的开始序列号。也即已经收到的数据的字节长度加1。
  • 数据偏移(4位长)—以4字节为单位计算出的数据段开始地址的偏移值。
  • 保留(3比特长)—须置0
  • 标志符(9比特长)
  • NS—ECN-nonce。ECN显式拥塞通知(Explicit Congestion Notification)是对TCP的扩展,定义于RFC 3540(2003)。ECN允许拥塞控制的端对端通知而避免丢包。ECN为一项可选功能,如果底层网络设施支持,则可能被启用ECN的两个端点使用。在ECN成功协商的情况下,ECN感知路由器可以在IP头中设置一个标记来代替丢弃数据包,以标明阻塞即将发生。数据包的接收端回应发送端的表示,降低其传输速率,就如同在往常中检测到包丢失那样。
  • CWR—Congestion Window Reduced,定义于RFC 3168(2001)。
  • ECE—ECN-Echo有两种意思,取决于SYN标志的值,定义于RFC 3168(2001)。
  • URG—为1表示高优先级数据包,紧急指针字段有效。
  • ACK—为1表示确认号字段有效
  • PSH—为1表示是带有PUSH标志的数据,指示接收方应该尽快将这个报文段交给应用层而不用等待缓冲区装满。
  • RST—为1表示出现严重差错。可能需要重新创建TCP连接。还可以用于拒绝非法的报文段和拒绝连接请求。
  • SYN—为1表示这是连接请求或是连接接受请求,用于创建连接和使顺序号同步
  • FIN—为1表示发送方没有数据要传输了,要求释放连接。
  • 窗口(WIN,16位长)—表示从确认号开始,本报文的发送方可以接收的字节数,即接收窗口大小。用于流量控制。
  • 校验和(Checksum,16位长)—对整个的TCP报文段,包括TCP头部和TCP数据,以16位字进行计算所得。这是一个强制性的字段。
  • 紧急指针(16位长)—本报文段中的紧急数据的最后一个字节的序号。
  • 选项字段—最多40字节。每个选项的开始是1字节的kind字段,说明选项的类型。
  • 0:选项表结束(1字节)
  • 1:无操作(1字节)用于选项字段之间的字边界对齐。
  • 2:最大报文段长度(4字节,Maximum Segment Size,MSS)通常在创建连接而设置SYN标志的数据包中指明这个选项,指明本端所能接收的最大长度的报文段。通常将MSS设置为(MTU-40)字节,携带TCP报文段的IP数据报的长度就不会超过MTU(MTU最大长度为1518字节,最短为64字节),从而避免本机发生IP分片。只能出现在同步报文段中,否则将被忽略。
  • 3:窗口扩大因子(4字节,wscale),取值0-14。用来把TCP的窗口的值左移的位数,使窗口值乘倍。只能出现在同步报文段中,否则将被忽略。这是因为现在的TCP接收数据缓冲区(接收窗口)的长度通常大于65535字节。
  • 4:sackOK—发送端支持并同意使用SACK选项。
  • 5:SACK实际工作的选项。
  • 8:时间戳(10字节,TCP Timestamps Option,TSopt)
    • 发送端的时间戳(Timestamp Value field,TSval,4字节)
    • 时间戳回显应答(Timestamp Echo Reply field,TSecr,4字节)

补充:

传输控制协议(英语:Transmission Control Protocol,缩写:TCP)是一种面向连接的、可靠的、基于字节流传输层通信协议,由IETFRFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能。用户数据报协议(UDP)是同一层内另一个重要的传输协议。

在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。

应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分割成适当长度的报文段(通常受该计算机连接的网络的数据链路层的最大传输单元(MTU)的限制)。之后TCP把结果包传给IP层,由它来透过网络将包传送给接收端实体的TCP层。TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认信息(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失并进行重传。TCP用一个校验和函数来检验数据是否有错误,在发送和接收时都要计算校验和。

建立TCP连接:三次握手

假设有客户A和服务器端B,首先服务端B端服务进程已经监听在某个端口上,监听之后就可以一直等待客户端请求建立TCP连接。

  1. 当客户端A想要和B建立TCP连接时,首先会发送一个连接请求报文给服务器端B,在这个请求报文中,TCP首部中的SYN位设置为1,ACK位设置为0,假设此时的序号是x(序号不一定是1)即:SYN=1、ACK=0、seq=x,这个包也常称为SYN包,当客户端发送完SYN包后,他将进入SYN_SENT状态。
  2. 当服务端B收到该报文后,发现其中的SYN=1、ACK=0,便知道这个TCP连接的请求包。如果B确认与A建立TCP连接,那么B需要回复A。回复时,SYN=1、ACK=1、ack=x+1、seq=y。注意区分这里的ACK与ack,ACK表示占用一个比特位的ACK设置位,而ack是确认号。这个包通常被称为ACK包,当服务端发送完ACK包之后,他将进入SYN_RECV状态。
  3. 当A收到B的回复报文后,发现里面SYN=1、ACK=1,于是也会向B回复一个ACK包,回复时,SYN=0、ACK=1、seq=x+1、ack=y+1。这里的SYN=0、ACK=1表示这个不是建立连接的请求包,而是回复包,A发送完之后,就进入ESTABLISHED状态,表示连接在A这端已经建立完成
  4. B在收到这个回复包之后,也将进入ESTABLISHED状态,此时,TCP连接建立完成。

需要注意的是,在B回复A的时候,也是发送了一个SYN=1的包,相当于请求A去建立一个TCP连接,所以A最后回复了一个ACK包

另一方面,A最后回复一个ACK包是威力避免无效连接请求再次重生的问题。因为A首先发送SYN包后,可能因为很长时间都没有被B接收到,于是A会在超时后重新传这个包,于是在网络上就会有两个SYN包,假设此时B接受到了其中一个SYN包,并就这个SYN包和A建立了连接,当数据传输完成时,TCP连接释放之后,B油突然接收到了另一个SYN包,此时,B会认为A又在请求建立TCP连接,如果B在回复之后就立即建立了TCP而不是等待A的回复,那么机于这个SYN包就会再次建立一个TCP连接,而这并不是A想要建立的,而如果A也发送了一个ACK包就可以避免这个问题,A在最后发送ACK后进入ESTABLISHED模式,不会再建立连接了,而B再收到这条ACK信息后也会进入ESTABLISHED状态。

断开TCP连接:四次挥手

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w9U4Phgx-1586216010167)(https://upload.wikimedia.org/wikipedia/commons/thumb/5/55/TCP_CLOSE.svg/1920px-TCP_CLOSE.svg.png)]

释放TCP连接的四次挥手过程

首先在两端开始释放TCP连接之前,都已经处在ESTABLISHED状态,假设现在A端开始请求释放连接(B也可以主动释放连接)

  1. A首先发送一个TCP首部FIN位置位1的包给B端,假设此时序列号位u,即seq=u。FIN=1意味着这是一个请求关闭TCP的数据包,这种包也被称为FIN包,当发送FIN包后,A将从ESTABLISHED状态变成FIN_WAIT_1状态
  2. B收到FIN包之后,发现其中FIN=1之后,知道A端请求关闭,于是发送一个回复包给A。回复时ACK=1.ack=u+1,同时还设置序号seq=v(假设时v)发送完这个回复之后,服务器B进入CLOSE_WAIT状态,到了这个阶段,A到B方向的连接就已经被释放了,所以CLOSE_WAIT状态也被称作半关闭状态
  3. 当A收到B的ACK包后,他将进入FIN_WAIT_2状态,等待B发起从B到A方向的连接关闭请求
  4. 当B确认已经没有其他数据需要发送后,B开始主动关闭B到A方向的TCP连接,这时候会发送一个FIN包,同时设置ACK为1,ack仍然保持不变,是u+1,而seq则为一个新值。因为在进入CLOSE_WAIT之后,B可能还发送了一些数据,B发送完这个FIN+ACK=1的包后将进入LAST_ACK状态
  5. 当A收到了这个FIN+ACK包后,需要对B发送的关闭请求作出回复,回复时,ACK=1,seq=u+1不变,ack=w+1。当发送完这个ACK包后。A不会立即关闭,而是进入TIME-WAIT阶段等待一段时间(2倍的MSL时长)RFC793定义了MSL为2分钟,Linux设置成了30s 连接可以工作在TCP半开状态。即一侧关闭了连接,不再发送数据;但另一侧没有关闭连接,仍可以发送数据。已关闭的一侧仍然应接收数据,直至对侧也关闭了连接
  6. 当B收到了A回复之后,意味着B到A方向的连接关闭已经确认了,于是B也关闭
  7. 而A在等待了2个MSL之后,将真正关闭

补充:

下表为TCP状态码列表,以S指代服务器,C指代客户端,S&C表示两者,S/C表示两者之一:

  • LISTEN S

服务器等待从任意远程TCP端口的连接请求。侦听状态。

  • SYN-SENT C

客户在发送连接请求后等待匹配的连接请求。通过connect()函数向服务器发出一个同步(SYNC)信号后进入此状态。

  • SYN-RECEIVED S

服务器已经收到并发送同步(SYNC)信号之后等待确认(ACK)请求。

  • ESTABLISHED S&C

服务器与客户的连接已经打开,收到的数据可以发送给用户。数据传输步骤的正常情况。此时连接两端是平等的。这称作全连接。

  • FIN-WAIT-1 S&C

(服务器或客户)主动关闭端调用close()函数发出FIN请求包,表示本方的数据发送全部结束,等待TCP连接另一端的ACK确认包或FIN&ACK请求包。

  • FIN-WAIT-2 S&C

主动关闭端在FIN-WAIT-1状态下收到ACK确认包,进入等待远程TCP的连接终止请求的半关闭状态。这时可以接收数据,但不再发送数据。

  • CLOSE-WAIT S&C

被动关闭端接到FIN后,就发出ACK以回应FIN请求,并进入等待本地用户的连接终止请求的半关闭状态。这时可以发送数据,但不再接收数据。

  • CLOSING S&C

在发出FIN后,又收到对方发来的FIN后,进入等待对方对己方的连接终止(FIN)的确认(ACK)的状态。少见。

  • LAST-ACK S&C

被动关闭端全部数据发送完成之后,向主动关闭端发送FIN,进入等待确认包的状态。

  • TIME-WAIT S/C

主动关闭端接收到FIN后,就发送ACK包,等待足够时间以确保被动关闭端收到了终止请求的确认包。【按照RFC 793,一个连接可以在TIME-WAIT保证最大四分钟,即最大分段寿命(maximum segment lifetime)的2倍】

  • CLOSED S&C

完全没有连接。

补充2:

TCP状态图PDF

3、TCP和UDP区别

UDP和TCP协议主要区别是两者在如何实现信息的可靠传递方面不同,TCP协议中包含了专门的传递保证机制,当数据接收方收到发送方传来的信息时,会自动向发送方发送确认消息;发送方只有在接收到该确认消息后才继续发送其他消息,否则就一直等待直到收到确认信息为止。

与TCP不同,UDP协议并不提供数据传送的保证机制。如果在从发送方到接收方的传递过程中出现数据报的丢失,协议本身并不能做出任何检测或提示。因此,通常人们把UDP协议称为不可靠的传输协议。

UDP协议

UDP(User Datagram Protocol)是用户数据报协议,是OSI的传输层协议。它只是比IP数据包多提供了很少一些功能,比如添加端口标识不同的应用层协议,差错检测等。

UDP的主要特点包括:

  1. UDP是无连接的,即发送数据之前不需要和对方先建立好连接(所以也没有关闭的过程)因此效率比较高
  2. UDP只能尽量保证数据可到达对方,但无法保证可靠的交付,主要还是因为没有建立连接,数据丢失后无法重传。
  3. UDP是面向数据报的,当应用采用UDP协议时,UDP将对数据添加首部后直接给网络层,他不会合并也不会拆分,而是应用层给多少数据UDP就包多少数据,包装好后的数据称作数据报,传输时以数据报为单位,一次传输一个报文。接收到UDP报文时,UDP解封后直接将整个数据交给应用层,所以,对于使用UDP协议的程序,必须选择大小合适的报文,如果报文太大,则在IP层对其进行分层,导致IP层效率变低
  4. UDP首部开销小,只有8字节,而TCP的首部有20字节,相比TCP而言,UDP的效率高
  5. UDP没有拥塞控制,在网络出现拥塞时,源主机不会因此而降低发送速率,所以UDP的实用性比较好,所以,对于允许丢失的一些数据,但又不需要高实用性的场景,UDP更为合适。
  6. 差错检测功能有限,在检验后发现不一致,则直接丢弃数据报

TCP协议

TCP协议首部的20个字符是固定的一些字段,20字节之后有一段可选字段也称为选项,长度可变

字符的含义前面有介绍,再次不在赘述

4、总结ip分类以及每个分类可以分配的IP数量

IP地址的分类:

如图可知:

对于A类地址,它的网络为只在第一个字节,所以主机位是3个字节。主机位的每个字节范围是0~255,其中不能全0或全255

所以A类地址:共有126个网段

每个网段的合法地址数量是256*256*256-2=16777214

对于B类地址,网络位占用2个字节,其范围为128-191,主机位是2个字节,所以,B类地址:

共有64*256=16384个网段

每个网段的合法地址数量是256*256-2=65534

对于C类地址,网络位占用3个字节,其范围位192-223,主机位是1个字节。

所以C类地址:

共有32*256*256=2097152个网段

每个网段的合法地址数量为256-2=254

5、IP配置方法

/etc/sysconfig/network-script/目录下有不少文件,绝大部分都是脚本类的文件,但有一类ifcfg开头的文件为网卡配置文件(interface config),所有ifcfg开头的文件在启动网络服务的时候都会被加载读取,具体的文件名ifcfg-xx的xx可以随便命名

通过网卡配置文件可设定IP地址,子网掩码,默认网关,DNS且永久生效

该文件的主要内容:

NAME:图形界面的网卡名
DEVICE:此配置文件应用到的设备
ONBOOT:在系统引导时是否激活此设备
TYPE:接口类型;常见有的Ethernet, Bridge
UUID:设备的惟一标识
BOOTPROTO:激活此设备时使用的地址配置协议,常用的dhcp, static, none, bootp
IPADDR:指明IP地址
PREFIX:以CIDR表示表示子网掩码如255.255.255.0就可以写成24
NETMASK:子网掩码
GATEWAY: 默认网关
DNS1:第一个DNS服务器指向
DNS2:第二个DNS服务器指向
HWADDR:对应的设备的MAC地址
NM_CONTROLLED:NM是NetworkManager的简写,此网卡是否接受NM控制;建议CentOS6为“no”
USERCTL:普通用户是否可控制此设备
PEERDNS:如果BOOTPROTO的值为“dhcp”,YES将允许dhcp server分配的dns服务器信息直接覆盖至/etc/resolv.conf文件,NO不允许修改resolv.conf

IP配置可分为动态和静态配置

动态配置需要DHCP服务支持,DHCP:动态主机设置协议

临时生效:

ifconfig

[root@centos-linux ~]# ifconfig eth0 down
# 临时禁用网卡eth0
# 会导致远程连接中断哦

[root@localhost ~]# ifconfig eth0 up
# 启用网卡

[root@localhost ~]# ifconfig eth0  1.1.1.1/24
# 配置网卡地址为1.1.1.1/24

ifconfig的操作修改只是临时生效,如果要永久生效需要更改/etc/sysconfig/network-script/ifcfg-eth0文件,并填写相关配置

ip

[root@localhost ~]# ip addr add 1.1.1.1/24 dev eth0
# 配置eth0 接口地址为1.1.1.1/24

[root@localhost ~]# ip addr del 1.1.1.1/24 dev eth0

# 删除eth0上的1.1.1.1/24地址

[root@localhost ~]# ip addr add 1.1.1.1/24 dev eth0 label eth0:0
# 添加别名为eth0:0地址为1.1.1.1/24


永久修改

[root@centos-linux ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 
# Generated by parse-kickstart
DEVICE="eth0"
IPV6INIT="yes"
BOOTPROTO="dhcp"
UUID="76fdc3ac-9181-4bfd-a55c-44afb986651f"
ONBOOT="yes"
...

猜你喜欢

转载自blog.csdn.net/FlamencaH/article/details/105356323
今日推荐