osi 七层协议
互联网协议按照功能不同分为osi七层或者tcp/ip 五层或tcp/ip 四层
tcp/ip 四层
1.应用层
2.传输层
3.网络层
4.网络接口层
tcp/ip 五层
1.应用层
2.传输层
3.网络层
4.数据链路层
5.物理层
tcp/ip 7层
1.应用层
2.表示层
3.会话层
4.传输层
5.网络层
6.数据链路层
7.物理层
每层运行常见物理设备
传输层==》四层交换机、四层的路由器
网络层==》路由器、三层交换机
数据链路层==》网桥、以太网交换机、网卡
物理层==》中继器、集线器、双绞线
tcp/ip 五层默写讲解
我们将应用层、表示层、会话层,从tcp/ip五层协议的角度来阐述每层的由来
与功能,搞清楚了每层的主要协议
就理解了整个互联网通信的原理
首先,用户感知到的只是最上面一层应用层,自上而下每层都依赖
与下一层,所以我们从最下层开始切入,比较好理解
以太网协议:
早期的时候各个公式都有自己的分组方式,后来形成了统一的标准,即以太网协议
ethernet
ethernet规定
一组电信号构成一个数据包,叫做 帧
每一数据帧分成:报头head和数据data两部分
head data
head 包含:(固定18个字节)
发送者/源地址, 6个字节
接收者/目标地址,6个字节
数据类型,6个字节
data包含:(最短46字节,最长1500字节)
数据包的具体内容
head 长度+data长度=最短64字节,最长1518字节,超过
最大限制就分片发送
mac地址:
head中包含的源和目标地址由来:ehernet规定接入
internet的设备都必须具备网卡,发送端和接收端的
地址便是指网卡的地址,即mac地址
mac地址:每块网卡出厂时都被烧制上一个世界唯一的
mac地址,长度为48为2进制,通常由12位16进制数表示
(前6位是厂商标号,后6位是流水线号)
广播:
有了mac地址,同一网络内的两台主机就可以通信了(一台主机通过
arp协议获取另外一台主机的mac地址)
ethernet采用最原始的方式,广播的方式进行通信,即计算机通信基本靠吼
网络层
网络层:有了ethernet、mac地址、广播的发送方式、世界上计算机
就可以彼此通信了,问题是世界范围的互联网是由
一个个彼此隔离的小的局域网组成的,那么如果所有的通信都采用以太网的广播方式,那么一台机器发送的包全世界都会受到,
这就是不仅仅是效率低的问题了,这会是一种灾难
网络层功能:引入一套新的地址用来区分不同的广播域/子网,这套地址即网络地址
ip协议:
规定:网络地址的协议叫ip协议,它定义的地址称之为IP地址
,广泛采用的v4版本即ipv4,它规定网络地址由32位2进制表示
范围0.0.0.0-255.255.255.255
一个ip地址通常写成四段十进制数,例:172.16.10.1
ip地址分为两部分:
网络部分:标识子网
主机部分:标识主机
注意:单纯的ip地址只是标识了地址的种类,从网络部分
或主机部分都无法辨识一个ip所处的子网
子网掩码:
所谓子网有掩码 就是标识子网络特征的一个参数,
他在形式上等同ip地址。也是一个32位二进制数字,它的网络
部分全部为1.主机部分全部为0.
比如ip地址
172.16.10.1,如果已知网络部分是前24位,主机部分是后8位,那么子网络掩码就是11111111.11111111.11111111.00000000,写成十进制就是255.255.255.0。
知道”子网掩码”,我们就能判断,任意两个IP地址是否处在同一个子网络。方法是将两个IP地址与子网掩码分别进行AND运算(两个数位都为1,运算结果为1,否则为0),然后比较结果是否相同,如果是的话,就表明它们在同一个子网络中,否则就不是。
比如,已知IP地址172.16.10.1和172.16.10.2的子网掩码都是255.255.255.0,请问它们是否在同一个子网络?两者与子网掩码分别进行AND运算,
172.16.10.1:10101100.00010000.00001010.000000001
255255.255.255.0:11111111.11111111.11111111.00000000
AND运算得网络地址结果:10101100.00010000.00001010.000000001->172.16.10.0
172.16.10.2:10101100.00010000.00001010.000000010
255255.255.255.0:11111111.11111111.11111111.00000000
AND运算得网络地址结果:10101100.00010000.00001010.000000001->172.16.10.0
结果都是172.16.10.0,因此它们在同一个子网络。
总结一下,IP协议的作用主要有两个,一个是为每一台计算机分配IP地址,另一个是确定哪些地址在同一个子网络
ip数据包
ip数据包也分为head和data部分,无需为ip包定义单独的栏位,直接放入
以太网包的datga部分
head:长度为20到60字节
data:最长为65,515字节。
而以太网数据包的”数据”部分,最长只有1500字节。因此,如果IP数据包超过了1500字节,它就需要分割成几个以太网数据包,分开发送了。
以太网头 | ip 头 | ip数据 |
ARP协议
arp协议由来:计算机通信基本靠吼,即广播的方式,所有上层的包到最后都要封装上以太网头,然后通过以太网协议发送,在谈及以太网协议时候,我门了解到
通信是基于mac的广播方式实现,计算机在发包时,获取自身的mac是容易的,如何获取目标主机的mac,就需要通过arp协议
arp协议功能:广播的方式发送数据包,获取目标主机的mac地址
协议工作方式:每台主机ip都是已知的
例如:主机172.16.10.10/24访问172.16.10.11/24
一:首先通过ip地址和子网掩码区分出自己所处的子网
场景 | 数据包地址 |
同一子网 | 目标主机mac,目标主机ip |
不同子网 | 网关mac,目标主机ip |
二:分析172.16.10.10/24与172.16.10.11/24处于同一网络(如果不是同一网络,那么下表中目标ip为172.16.10.1,通过arp获取的是网关的mac)
源mac | 目标mac | 源ip | 目标ip | 数据部分 | |
发送端主机 | 发送端mac | FF:FF:FF:FF:FF:FF | 172.16.10.10/24 | 172.16.10.11/24 | 数据 |
三 这个包会以广播的方便时在发送端所处的自网内传输
所有主机接收后拆开包,发现目标ip为自己的,就响应,返回自己mac
传输层的由来:网络层的ip帮我们区分子网,以太网层的mac帮我们找到主机,然后大家使用的都是应用程序,你的电脑上可能同时开启qq,暴风影音,等多个应用程序,
那么我们通过ip和mac找到了一台特定的主机,如何标识这台主机上的应用程序,答案就是端口,端口即应用程序与网卡关联的编号。
传输层功能:建立端口到端口的通信
补充:端口范围0-65535,0-1023为系统占用端口
tcp协议:
可靠传输,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割。
以太网头 | ip 头 | tcp头 | 数据 |
udp协议:
不可靠传输,”报头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包。
以太网头 | ip头 | udp头 | 数据 |
tcp三次握手和四次挥手
首先客户端:
进行连接请求:
SYS_SENT---------》SYN seq =x-----> LISTEN
客户端向服务端发送请求
ESTABLISHED<--SYN seq=y,ACK=X+1<-SYN_RCVD
服务器发送连接请求 和反馈客户连接成功
ESTABLISHED-----》ACK=y+1-->ESTABLISHED
CLENT WRITE----->seq=x+1 ACK=y+1-->read
CLENT <-------------ACK X+2-------------<----READ SERVER
FIN_WAIT_1------------->FIN seq=X+2 ACK=Y+1------------->CLOSE_WAIT
FIN_WAIT_2-------<------ACK X+3----------<----------------------CLOSE_WAIT
TIME_WAIT<-------------------------<-FIN seq=y+1-------------------LAST_ACK(CLOSE)
TIME_WAIT------------------------->-ACK =y+2--------------------->server
CLOSED:表示关闭状态(初始状态)。
LISTEN:该状态表示服务器端的某个SOCKET处于监听状态,可以接受连接。
SYN_SENT:这个状态与SYN_RCVD遥相呼应,当客户端SOCKET执行CONNECT连接时,它首先发送SYN报文,随即进入到了SYN_SENT状态,并等待服务端的发送三次握手中的第2个报文。SYN_SENT状态表示客户端已发送SYN报文。
SYN_RCVD: 该状态表示接收到SYN报文,在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂。此种状态时,当收到客户端的ACK报文后,会进入到ESTABLISHED状态。
ESTABLISHED:表示连接已经建立。
FIN_WAIT_1: FIN_WAIT_1和FIN_WAIT_2状态的真正含义都是表示等待对方的FIN报文。区别是: FIN_WAIT_1状态是当socket在ESTABLISHED状态时,想主动关闭连接,向对方发送了FIN报文,此时该socket进入到FIN_WAIT_1状态。 FIN_WAIT_2状态是当对方回应ACK后,该socket进入到FIN_WAIT_2状态,正常情况下,对方应马上回应ACK报文,所以FIN_WAIT_1状态一般较难见到,而FIN_WAIT_2状态可用netstat看到。
FIN_WAIT_2:主动关闭链接的一方,发出FIN收到ACK以后进入该状态。称之为半连接或半关闭状态。该状态下的socket只能接收数据,不能发。
TIME_WAIT: 表示收到了对方的FIN报文,并发送出了ACK报文,等2MSL后即可回到CLOSED可用状态。如果FIN_WAIT_1状态下,收到对方同时带 FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。
CLOSE_WAIT: 此种状态表示在等待关闭。当对方关闭一个SOCKET后发送FIN报文给自己,系统会回应一个ACK报文给对方,此时则进入到CLOSE_WAIT状态。接下来呢,察看是否还有数据发送给对方,如果没有可以 close这个SOCKET,发送FIN报文给对方,即关闭连接。所以在CLOSE_WAIT状态下,需要关闭连接。
LAST_ACK: 该状态是被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。当收到ACK报文后,即可以进入到CLOSED可用状态。
tcp第十一种状态:
CLOSING:这种状态较特殊,属于一种较罕见的状态。正常情况下,当你发送FIN报文后,按理来说是应该先收到(或同时收到)对方的ACK报文,再收到对方的FIN报文。但是CLOSING状态表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。什么情况下会出现此种情况呢?如果双方几乎在同时close一个SOCKET的话,那么就出现了双方同时发送FIN报文的情况,也即会出现CLOSING状态,表示双方都正在关闭SOCKET连接。
Client server
SYN_SENT(此状态表示已经发送报文) client发送报文 SYN seq=x 报文 SYN_RCVE (已接收到SYN报文)状态
ESTABLISHED(此状态表示已建立连接) server发送报文 SYN seq=y,ACK=x+1 SYN_RCVE 状态
ESTABLISHED 发送报文ACK=y+1 ESTABLISHED (接收到ACK报文)
client(发送数据write) client seq=x+1 ACK=y=1 server(接收数据read)
client(接收反馈) server ACK x+2 server(接收到数据)
FIN_WAIL_1[CLOSE] client FIN seq=x+2 ACK=y+1 CLOSE_WAIT[此时等待关闭]
等待对方报文,但是主动发送FIN报文关闭连接 {会在发送ACK 报文的时候进入此状态}
FIN_WAIL_2 server ACK x+3 CLOSE_WAIT
[此状态已经接收到ACK报文]
TIME_WAIT server FIN seq=y+1 LAST_ACK(close)
[此状态表示收到对方报文] [此状态表示等待对方报文ACK]
TIME_WAIT clent ACK=y=2 server closed