一、简述OSI七层模型和TCP/IP五层模型;
网络协议通常分不同层次进行开发,每一层分别负责不同的通行功能。
1、OSI七层模型
1)OSI:Open System Internetconnection(开放系统互联);
由ISO国际标准化组织定义,目的是规范网络环境,实现软硬件兼容;自上而下共分为七层,分别为:应用层,表示层,会话层,传输层,网络层,数据链路层,物理层。
2)各层图示及作用;
3)特点;
上层依赖于下层,下层为上层提供服务
4)各层功能简述;
----物理层(PDU是:数据位 bit)
I、为数据端设备提供传送数据的通路;
II、传输数据;
III、完成物理层的一些工作。
---数据链路层(PDU是:数据帧 frame)
通过各种协议,将有差错的物理信道变为无差错的能可靠传输数据帧的数据链路。
---网络层(PDU是:数据包 packet)
通过路由算法为报文或分组通过通信子网选择最适当的路径。
---传输层( PDU是:数据段 segment)
向用户提供可靠的端到端的差错和流量控制,保证报文的正确传输。
---会话层(PDU是:消息 message)
组织和协调两个会话进程之间的通信,并对数据交换进行管理。
---表示层(PDU是:消息 message)
处理用户信息的表示问题,如:编码、数据转换和加密解密。
---应用层(PDU是:消息 message)
直接向用户提供服务,完成用户希望在网络上完成的各种工作。
--PDU(Protocol Data Unit):协议数据单元。是指在分层网络结构,例如在开放式系统互联模型中,在传输系统的每一层都将建立OSI协议数据单元(PDU)。
2、TCP/IP五层模型
1)TCP/IP(Transmission Control Protocol/Internet Protocol:传输控制协议/网际协议)协议
属于网络传输协议。TCP提供IP环境下的数据可靠传输,它提供的服务包括数据流传送、可靠性、有效流控、全双工操作和多路复用。通过面向连接、端到端和可靠的数据包发送。TCP/IP的应用层相当于OSI七层协议的应用层、表示层、会话层,其他各层一一对应。
2)TCP/IP五层模型和OSI七层模型联系及对应网络层协议;
3)每一层都工作着的设备,比如我们常用的交换机就工作在数据链路层的,一般的路由器是工作在网络层的。
4)各层功能及简述;
每一层都呼叫它的下一层提供的网络来完成自己的需求。(若是四层模型数据链路层和物理层在一层,叫网络链路层)
---物理层
负责光电信号传递方式。集线器工作在物理层。以太网协议。
---数据链路层
负责设备之间的数据帧的传输和识别。交换机工作在数据链路层。例如网卡设备的驱动,帧同步,冲突检测,数据差错校验等工作。
---网络层
负责地址管理和路由选择。路由器工作在网络层。
---传输层
负责两台主机之间的数据传输。
---应用层
负责应用程序之间的沟通。网络编程主要针对的就是应用层。
二、总结描述TCP三次握手四次挥手;
1、定义
TCP/IP协议:Transmissoin Control Protocol/Internet Porotocol-传输控制协议/网际协议定义了电子设备如何接入英特网,以及数据如何在它们之间传输的标准。采用了4层的层级结构,每层都呼叫它的下一层提供的协议完成自己的需求。
TCP协议:是一种面向连接的,可靠的基于字节流的传输层面的通信协议。
IP协议:网络层协议,只为主机提供一种无连接,不可靠的,尽力而为的数据传输服务。
2、TCP包头
-----参数详解
源端口、目标端口:计算机上的进程要和其他进程通信是要通过计算机端口的,而一个计算机端口某个时刻只能被一个进程占用,所以通过指定源端口和目标端口,就可以知道是哪两个进程需要通信。源端口、目标端口是用16位表示的,可推算计算机的端口个数为2^16个;
序列号:在建立连接时由计算机生成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发送一次数据,就「累加」一次该「数据字节数」的大小。用来解决网络包乱序问题;
确认号:指下一次「期望」收到的数据的序列号,发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。用来解决不丢包的问题;
数据偏移:表示TCP报文段的首部长度,共4位,由于TCP首部包含一个长度可变的选项部分,需要指定这个TCP报文段到底有多长。它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。该字段的单位是32位(即4个字节为计算单位),4位二进制最大表示15,所以数据偏移也就是TCP首部最大60字节;
控制位:
URG:表示本报文段中发送的数据是否包含紧急数据。后面的紧急指针字段(urgent pointer)只有当URG=1时才有效;
ACK:该位为 1 时,「确认应答」的字段变为有效,TCP 规定除了最初建立连接时的 SYN 包之外该位必须设置为 1;
PSH:提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间。如果为1,则表示对方应当立即把数据提交给上层应用,而不是缓存起来,如果应用程序不将接收到的数据读走,就会一直停留在TCP接收缓冲区中;
RST:该位为 1 时,表示 TCP 连接中出现异常必须强制断开连接;
SYN:该位为 1 时,表示希望建立连,并在其「序列号」的字段进行序列号初始值的设定;
FIN:该位为 1 时,表示今后不会再有数据发送,希望断开连接。当通信结束希望断开连接时,通信双方的主机之间就可以相互交换 FIN 位置为 1 的 TCP 段;
窗口大小:表示现在允许对方发送的数据量,也就是告诉对方,从本报文段的确认号开始允许对方发送的数据量,达到此值,需要ACK确认后才能再继续传送后面数据,由Window size value * Window size scaling factor(此值在三次握手阶段TCP选项Window scale协商得到)得出此值;
校验和:提供额外的可靠性;
紧急指针:标记紧急数据在数据字段中的位置;
选项部分:其最大长度可根据TCP首部长度进行推算。TCP首部长度用4位表示,选项部分最长为:(2^4-1)*4-20=40字节;
3、TCP/IP协议数据封装与解封装;
------数据封装
过程大致如下:
1)用户信息转换为数据,以便在网络上传输;
2)数据转换为数据段,并在发送方和接收方主机之间建立一条可靠的连接;
3)数据段转换为数据包或数据报,并在报头中放上逻辑地址,这样每一个数据包都可以通过互联网络进行传输;
4)数据包或数据报转换为帧,以便在本地网络中传输。在本地网段上,使用硬件地址唯一标识每一台主机;
5)帧转换为比特流,并采用数字编码和时钟方案。
FCS(Frame Check Sequence):帧检验序列,让接收[帧]或接口判断是否发生了错误,为4字节长。
----详解:
应用层:用户数据经过应用层协议封装后传递给传输层;
传输层:封装TCP头部,交给网络层;-----段
网络层:网络层封装IP头部后,再交给数据链路层; --数据报
数据链路层:数据链路层封装Ethernet帧头和帧尾,交给物理层; --帧
物理层:物理层以比特流的形式将数据发送到物理线路上。
如下图所示,在传输层用TCP头已标示了与一个特定应用的连接,并将数据封装成了数据段;网络层则用IP头标示了已连接的设备网络地址,并可基于此信息进行网络路径选择,此时将数据封装为数据包;到了数据链路层,数据已封装成了数据帧,并用MAC头给出了设备的物理地址,当然还有数据校验等功能字段等;到了物理层,则已封装成为比特流,就成为纯粹的物理连接了。
------数据解封装
----详解:
数据的接收端从物理层开始,进行与发送端相反的操作,称为“解封装”,如下图所示,最终使应用层程序获取数据信息,使得两点之间的一次单向通信完成。
-----参考链接:数据封装和解封装
4、对等通信
5、TCP三次握手四次挥手;
1)TCP三次握手和状态变迁;
---为什么需要 TCP 协议?TCP 工作在哪一层?
IP 层是「不可靠」的,它不保证网络包的交付、不保证网络包的按序交付、也不保证网络包中的数据的完整性。
如果需要保障网络数据包的可靠性,那么就需要由上层(传输层)的 TCP 协议来负责。因为 TCP 是一个工作在传输层的可靠数据传输的服务,它能确保接收端接收的网络包是无损坏、无间隔、非冗余和按序的。
---什么是TCP?
TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。
-面向连接:一定是「一对一」才能连接,不能像 UDP 协议 可以一个主机同时向多个主机发送消息,也就是一对多是无法做到的;
-可靠的:无论的网络链路中出现了怎样的链路变化,TCP 都可以保证一个报文一定能够到达接收端;
-字节流:消息是「没有边界」的,所以无论我们消息有多大都可以进行传输。并且消息是「有序的」,当「前一个」消息没有收到的时候,即使它先收到了后面的字节已经收到,那么也不能扔给应用层去处理,同时对「重复」的报文会自动丢弃。
---什么是TCP连接?
简单来说就是,用于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括Socket、序列号和窗口大小称为连接。
所以我们可以知道,建立一个 TCP 连接是需要客户端与服务器端达成上述三个信息的共识。
Socket:由 IP 地址和端口号组成
序列号:用来解决乱序问题等
窗口大小:用来做流量控制
---如何唯一确定一个 TCP 连接呢?
TCP 四元组可以唯一的确定一个连接,四元组包括如下:
源地址和目的地址的字段(32位)是在 IP 头部中,作用是通过 IP 协议发送报文给对方主机。
源端口和目的端口的字段(16位)是在 TCP 头部中,作用是告诉 TCP 协议应该把报文发给哪个进程。
TCP 是面向连接的协议,所以使用 TCP 前必须先建立连接,而建立连接是通过三次握手而进行的。目的是同步连接双方的序列号和确认号并交换TCP窗口大小信息。
具体过程:
一开始,客户端和服务端都处于CLOSED状态。先是服务端主动监听某个端口,处于LISTEN状态。
---三次握手的第一个报文,SYN报文;
说明:客户端会随机初始化序号(client_isn),将此序号置于 TCP 首部的「序号」字段中,同时把 SYN 标志位置为 1 ,表示 SYN 报文。接着把第一个 SYN 报文发送给服务端,表示向服务端发起连接,该报文不包含应用层数据,之后客户端处于 SYN-SENT 状态。
---三次握手的第二个报文,SYN+ACK报文;
说明:服务端收到客户端的 SYN 报文后,首先服务端也随机初始化自己的序号(server_isn),将此序号填入 TCP 首部的「序号」字段中,其次把 TCP 首部的「确认号」字段填入 client_isn + 1, 接着把 SYN 和 ACK 标志位置为 1。最后把该报文发给客户端,该报文也不包含应用层数据,之后服务端处于SYN-RCVD状态。
---三次握手的第三个报文,ACK报文;
说明:客户端收到服务端报文后,还要向服务端回应最后一个应答报文,首先该应答报文 TCP 首部 ACK 标志位置为 1 ,其次「确认号」字段填入 server_isn + 1 ,最后把报文发送给服务端,这次报文可以携带客户到服务器的数据,之后客户端处于ESTABLISHED状态。
服务器收到客户端的应答报文后,也进入ESTABLISHED状态。
**********从上面的过程可以发现第三次握手是可以携带数据的,前两次握手是不可以携带数据的。
一旦完成三次握手,双方都处于 ESTABLISHED 状态,至此连接就已建立完成,客户端和服务端就可以相互发送数据了。
--使用wireshark抓包分析TCP三次握手:
第一次握手说明:客户端发送了一个TCP,标志位为SYN,序列号seq为0,表示客户端请求建立连接。
第二次握手说明:服务器发回确认包,标志位为SYN,ACK,将确认序列号ack设置为客户端序列号seq+1,即0+1=1。
第三次握手说明:客户端再次发送确认包(ACK),SYN标志位为0,ACK标志位为1,并且把服务器发来ack的序号seq字段+1,即第二次握手的seq+1=0+1=1,放在确认字段中发送给对方,并且在数据段放写ISN的+1。
---如何在 Linux 系统中查看 TCP 状态?
[root@localhost ~]# netstat -napt
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 7089/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 7233/master
tcp 0 0 192.168.1.113:22 192.168.1.100:50489 ESTABLISHED 7432/sshd: root@not
tcp 0 48 192.168.1.113:22 192.168.1.100:50488 ESTABLISHED 7430/sshd: root@pts
tcp6 0 0 :::22 :::* LISTEN 7089/sshd
tcp6 0 0 ::1:25 :::* LISTEN 7233/master
Proto:TCP协议
Local Address:源地址+端口
Foreign Address:目标地址+端口
State:连接状态
PID/Program name:Web服务的进程PID和进程名称
2)TCP 四次挥手过程和状态变迁;
天下没有不散的宴席,对于 TCP 连接也是这样, TCP 断开连接是通过四次挥手方式。双方都可以主动断开连接,断开连接后主机中的「资源」将被释放。
假设客户端主动断开连接:
具体过程:
---四次挥手的第一个报文,FIN报文;
说明:客户端打算关闭连接,此时会发送一个 TCP 首部 FIN 标志位被置为 1 的报文,也即 FIN 报文,之后客户端进入FIN_WAIT1状态。
---四次挥手的第二个报文,ACK报文;
说明:服务端收到该报文后,就向客户端发送 ACK 应答报文,接着服务端进入CLOSED_WAIT状态。客户端收到服务端的 ACK 应答报文后,之后进入FIN_WAIT2状态。
---四次挥手的第三个报文,FIN+ACK报文;
说明:等待服务端处理完数据后,也向客户端发送 FIN+ACK 报文,之后服务端进入LAST_ACK状态。
---四次挥手的第四个报文,ACK报文;
说明:客户端收到服务端的 FIN 报文后,回一个 ACK 应答报文,之后进入 TIME_WAIT状态
服务器收到了 ACK 应答报文后,就进入了CLOSE状态,至此服务端已经完成连接的关闭。
客户端在经过 2MSL 一段时间后,自动进入CLOSE状态,至此客户端也完成连接的关闭。
**********这里一点需要注意是:主动关闭连接的,才有 TIME_WAIT 状态。
--使用wireshark抓包分析TCP四次挥手:
第一次挥手说明:此处挥手是由服务端发起,服务端会发送一个FIN,用来关闭服务端到客户端的数据,服务端seq=304,ack=666,将标志为ACK,FIN置为1。
第二次挥手说明:客户端收到FIN,然后回发一个确认序号=服务端发送的序号+1=304+1=305,以及自己的seq=666。
第三次挥手说明:客户端关闭与服务端的连接,发送一个FIN+ACK,seq=666,ack=305,FIN置为1。
第四次挥手说明:服务端发回ACK报文确认,并将确认序号ack=seq+1=666+1=667,将FIN置为0。
涉及字段解释:
seq(Sequence Number):用来标识从TCP发端向TCP收端发送的数据字节流,它表示在这个报文段中的第一个数据字节在数据流中的序号。主要用来解决网络报乱序的问题。
ack(Acknowledgement Number):32位确认序列号包含发送确认的一端所期望收到的下一个序号,因此确认序号应当是上次已完成功收到数据字节序号加1,不过,只有当标志位中的ACK标志为1时确认字段的序号才有效。主要用来解决不丢包的问题。
ACK标志位:此标志表示应答域有效,TCP应答号将会包含在TCP数据包中,取值0或1,1表示应答域有效,反正为0。
SYN标志位:建立连接时用于同步序号。当SYN=1,ACK=0表示这是一个连接请求报文段。若同意连接,则在响应报文段中使得SYN=1,ACK=1。因此,SYN=1表示这是一个连接请求或连接接受报文。SYN标志位只有在TCP建立连接时才会补置1,握手完成后SYN标志位补置为0。
FIN标志位:表示发送端已经到达数据末尾,即双方的数据传送完成,发送FIN标志位的TCP数据包后,连接将被断开。
MSL(Maximium Segement Lifetime):最长寿命报文,此处1MSL=2min。
Time_wait:期间不能释放或回收利用套接字资源(端口)。
!!!ACK,SYN,FIN这些大写表示标志位,值位0或1;
!!!ack,seq小写的单词表示序号。
三、描述TCP和UDP区别;
---TCP头部格式:
UDP:Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法
1)UDP 不提供复杂的控制机制,利用 IP 提供面向「无连接」的通信服务;
2)UDP 协议真的非常简,头部只有 8 个字节( 64 位),UDP 的头部格式如下:
--UDP头部格式:
-目标和源端口:主要是告诉 UDP 协议应该把报文发给哪个进程。
-包长度:该字段保存了 UDP 首部的长度跟数据的长度之和。
-校验和:校验和是为了提供可靠的 UDP 首部和数据而设计。
1、连接
TCP 是面向连接的传输层协议,传输数据前先要建立连接;
UDP 是不需要连接,即刻传输数据。
2、服务对象
TCP 是一对一的两点服务,即一条连接只有两个端点;
UDP 支持一对一、一对多、多对多的交互通信。
3、可靠性
TCP 是可靠交付数据的,数据可以无差错、不丢失、不重复、按需到达;
UDP 是尽最大努力交付,不保证可靠交付数据。
4、拥塞控制、流量控制
TCP 有拥塞控制和流量控制机制,保证数据传输的安全性;
UDP 则没有,即使网络非常拥堵了,也不会影响 UDP 的发送速率。
5、首部开销
TCP 首部长度较长,会有一定的开销,首部在没有使用「选项」字段时是 20 个字节,如果使用了「选项」字段则会变长的;
UDP 首部只有 8 个字节,并且是固定不变的,开销较小。
四、总结IP分类以及每个分类可以分配的IP数量;
1、IP地址
1)它们可唯一标识 IP 网络中的每台设备;
2)每台主机(计算机、网络设备、外围设备)必须具有唯一的地址;
3)IP地址由两部分组成
• 网络ID:
标识网络;
每个网段分配一个网络ID;
• 主机 ID:
标识单个主机;
由组织分配给各设备;
2、IPv4地址格式
有十进制和二进制两种表示方法。分别是:
点分四组十进制。每一组范围是[0~255],如:255.255.255.255,二进制为:11111111 11111111 11111111 11111111
二进制各位置代表数值0代表0,1在各位置代表不同
每8位二进制从左到右对对应的权值
即2的n-1次方,n是从右到左当前位的位数,如第一位为2^0=1,而IP就是每一组8位二进制数相加所得。
如:11111111 11111111 11111111 11111111 由于每一组都相同,所以算一次即可 11111111===》128+64+32+16+8+4+2+1=255
所以转换成十进制的IP就是:255.255.255.255
点分十进制记法详解
2、IP地址分类
1)IP地址分类;
IP地址中的前5位用于标识IP地址的类别:
A类地址的第一位为0;
B类地址的前两位为10;
C类地址的前三位为110;
D类地址的前四位为1110;
E类地址的前五位为11110
2)IP地址分类详解;
A类:
0 000 0000 - 0 111 1111: 1-127
网络数:126, 127
每个网络中的主机数:2^24-2=16777214
默认子网掩码:255.0.0.0
私网地址:10.0.0.0
B类:
10 00 0000 - 10 11 1111:128-191
网络数:2^14=16384
每个网络中的主机数:2^16-2=65534
默认子网掩码:255.255.0.0
私网地址:172.16.0.0-172.31.0.0
C类:
110 0 0000 - 110 1 1111: 192-223
网络数:2^21=2097152
每个网络中的主机数:2^8-2=254
默认子网掩码:255.255.255.0
私网地址:192.168.0.0-192.168.255.0
D类:组播
1110 0000 - 1110 1111: 224-239
E类:保留未使用
240-255
3)公共IP地址和私有IP地址;
4)特殊地址;
特殊地址
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服务器获取地址,系统会为主机分配这样地址。
5)保留地址;
五、总结IP配置方法;
1、使用ifconfig命令配置 (临时生效,重启系统或网络服务后失效);
##查看IP
[root@localhost ~]# ifconfig ens33
ens33: flags=4163 mtu 1500
inet 192.168.1.112 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::394c:5ddf:1963:9164 prefixlen 64 scopeid 0x20
ether 00:0c:29:7e:18:ef txqueuelen 1000 (Ethernet)
RX packets 116 bytes 13419 (13.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 116 bytes 17540 (17.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
##临时修改IP
[root@localhost ~]# ifconfig ens33 192.168.1.117/24
虚拟机登陆查看:
重启网络服务再次查看:
2、修改配置文件,持久生效;
[root@localhost ~]#vim /etc/sysconfig/network-scripts/ifcfg-ens33
绿色框为关键字样,将IPADDR处修改为192.168.1.117
然后重启网络
[root@localhost ~]#systemctl restart network
之前的112的连接已断开:
新的117连接生效:
3、使用ip命令添加IP地址;
[root@localhost ~]# ip a | grep ens33
2: ens33: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.1.117/24 brd 192.168.1.255 scope global noprefixroute ens33
######添加IP
[root@localhost ~]# ip addr add 172.16.10.100/16 dev ens33
[root@localhost ~]# ip a | grep ens33
2: ens33: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.1.117/24 brd 192.168.1.255 scope global noprefixroute ens33
inet 172.16.10.100/16 scope global ens33
######删除IP
[root@localhost ~]# ip addr del 172.16.10.100/16 dev ens33
[root@localhost ~]# ip a | grep ens33
2: ens33: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.1.117/24 brd 192.168.1.255 scope global noprefixroute ens33
4、使用nmcli命令添加IP地址;
[root@localhost ~]# ip a | grep ens33
2: ens33: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.1.117/24 brd 192.168.1.255 scope global noprefixroute ens33
[root@localhost ~]# nmcli con add con-name ens33-tmp ifname ens33 type ethernet ipv4.method manual ipv4.addresses 172.16.10.100/16
连接“ens33-tmp”(a66121c3-1914-4df1-bac4-7ce5ce291855) 已成功添加。
[root@localhost ~]# nmcli con
NAME UUID TYPE DEVICE
ens33 43dfe77a-2584-4d6e-a59b-2810890c99b4 ethernet ens33
ens33-tmp a66121c3-1914-4df1-bac4-7ce5ce291855 ethernet --
[root@localhost ~]# nmcli con up ens33-tmp
虚拟机查看:
再次启动ens33网卡:
之前的连接也恢复了: