34---网络协议

一 C/S架构 B/S架构

1 CS架构
Client<----------->Sever
如:网易云音乐
客户端软件                        服务端软件
操作系统                          操作系统
计算机硬件《-----------网络通信---------》计算机硬件
2 BS架构:不需要写客户端软件
Browser<----------->Sever
# 两种架构的区别:数据传输的规则,CS传输标准自己制定,BS传输标准需要按照浏览器的标准

二 网络通信

网络存在的意义
    就是跨地域数据传输===》称之为通信
什么是网络
    物理链接介质 + 互联网通信协议(通信的标准)
    通信标准:比如打电话,和美国人打电话就需要说英语,和中国人说话就是说汉语
互联网本质
	一系列的网络协议

三 OSI七层协议

  • 互联网协议按照功能不同分为osi七层或tcp/ip五层或tcp/ip四层

  • OSI七层协议数据传输的封包与解包过程

协议:规定数据的组织格式
    格式:头部+数据部分
    
五层协议
    应用层
        表示层
        会话层
    传输层(封装后称为:段)
    网络层(封装后称为:包)
    数据链路层(封装后称为:帧)
    物理层(封装后称为:位):基于电信号通信0100010001

四 五层模型介绍

用户感知到的只是最上面的应用层,自上而下 每层都依赖下一层,所以从最下面一层介绍。
每层运行特定的协议,越往上越靠近用户,越往下越靠近硬件

4.1 物理层

物理层:负责发送电信号
    一组物理层数据称之为 位
    单纯的电信号是没有数据意义的,对电信号进行分组才能使其具有数据意义,
问题:如何进行分组-----数据链路层

4.2 数据链路层

  • 4.2.1 数据链路层的功能
由来:单纯的电信号没有任何意义,必须规定电信号多少位一组,每组什么意思
功能:定义了电信号的分组方式
  • 4.2.2 以太网协议
- 以太网协议的规定
	- 规定1:一组电信号构成一个数据包,叫做‘帧’
	
  	- 规定2:数据帧分成两个部分=>头+数据(所有协议都是这么规定的)
  	
      | head---固定18个字节 | data |
      头包含:源地址与目标地址  该地址是mac地址 
      数据类型:包含的是网路层发过来整体的内容

	- 规定3:但凡接入互联网的主机必须有一块网卡,每块网卡在出厂时都烧制好一个全世界独一无二的地址,该地址称为mac地址
  • 4.2.3 广播
注意:计算机通信基本靠吼,即以太网协议的工作方式是 广播(吼)

连到同一个交换机上的计算机都在同一个广播域

理论上只要有数据链路层可以实现全世界的网络通信,但是是不合理的,全世界的计算机不可能存在于同一个广播域

产生的问题:所有计算机在同一广播域,吼一嗓子,所有计算机都能收到,数据量太大

解决方法:将计算机放到不同的广播域中---网络层

4.3 网络层

  • 4.3.1 网络层的功能
由来:解决数据链路层产生的问题
功能:引入一套新的地址用来区分不同的广播域/子网,这套地址即网络地址
  • 4.3.2 IP协议
介绍:规定网络地址的协议叫Ip协议,定义的地址称为IP地址,广泛采用的是IPV4,规定网络地址由32位2进制表示
ipv4:
    8bit.8bit.8bit.8bit
    0.0.0.0   -----  255.255.255.255

用十进制表示:
	范围:0.0.0.0-255.255.255.255
IP协议规定
规定1:一组数据称之为一个数据包
规定2:数据包分成两个部分=>头+数据(所有协议都是这么规定的)

    头包含:源地址与目标地址  该地址是IP地址
    数据包含:传输层发过来的整体内容
	
  • 4.3.3 IP地址分成两部分
网络部分:标识子网
主机部分:标识主机
注意:
1 单纯的ip地址段只是标识了IP地址的种类,从网络部分或主机部分都无法辨识一个ip所处的子网。
2 一个合法的IPV4地址组成部分=ip地址/子网掩码地址
    格式1:172.16.10.1/255.255.255.0
    格式2:172.16.10.1/24  (24表示连续的24个二进制下的1,等同于255.255.255.0)
    格式3:172.16.10.1
    
  • 4.3.4 子网掩码
子网掩码:是表示子网特征的一个参数,在形式上等同于IP地址,也是一个32位二进制数字,它的网络部分全部为1,主机部分全部为0
比如:
IP地址:172.16.10.1
如果已知网络部分是前24位,主机部分是后8位,那么子网的网络的掩码就是
11111111.11111111.11111111.00000000,写成十进制就是255.255.255.0。
子网掩码的功能:判断任意两个IP地址是否处于同一个子网/广播域

判断两个IP地址是否处于同一个子网的方法:
	将两个IP地址与子网掩码分别进行‘与’运算(两个数位都为1,运算结果为1,否则为0),如果比较结果相同,如果相同就表明它们在同一个子网中,否则不在。
	
判断两个计算机是否属于同一个局域网
1 如果在一个局域网,直接靠吼即可
2 如果不在同一个局域网,通过网关,将包输出到公网,根据路由协议传给另一个网络地址

举例:
IP地址和子网掩码配合到一起会计算出一个广播域地址/子网地址/局域网地址
如何计算:将IP地址和子网掩码地址转换为二级制 --- 按位与运算
计算机1:
172.16.10.1:       10101100.00010000.00001010.00000001
255.255.255.0    11111111.11111111.11111111.00000000
计算结果:网络地址
172.16.10.0: 10101100.00010000.00001010.00000000

计算机2
172.16.10.2:       10101100.00010000.00001010.00000010
255.255.255.0    11111111.11111111.11111111.00000000
计算结果:网络地址
172.16.10.0: 10101100.00010000.00001010.00000000
  • 4.3.5 ARP 协议
协议由来:计算机通信基本靠吼,即广播的方式,所有上层的包到最后都要封装上以太网头,然后通过以太网协议发送,在谈及以太网协议时候,我们了解到通信是基于mac的广播方式实现,计算机在发包时,获取自身的mac是容易的,如何获取目标主机的mac,就需要通过arp协议。

协议功能:广播的方式发送数据包,通过对方IP地址,获取目标主机的mac地址
协议的工作方式:每台主机的IP都是已知的

计算机1和计算机2在同一个局域网内,直接通信即可
计算机1                直接         计算机2
ARP:
自己的IP,对方的IP      
1 计算机二者网络地址如果一样,拿到计算机2的mac地址就可以了                
2 发送广播包FF:FF:FF:FF:FF:FF,得到计算机2的mac地址
发送端mac  FF:FF:FF:FF:FF:FF  172.16.10.1/24(计算机1的IP地址)   172.16.10.2/24(计算机2的IP地址)
(源mac地址,目标mac地址)(源IP地址,目标IP地址)


计算机1和计算机2不在一个局域网
计算机1:172.16.10.1/24               网关         计算机2:101.100.200.11/10
ARP:
自己的IP,对方的IP      
1 计算机二者网络地址如果不一样,拿到网关的mac地址就可以了  
2 发送广播包FF:FF:FF:FF:FF:FF,得到网关的mac地址
发送端mac  FF:FF:FF:FF:FF:FF  172.16.10.1/24           172.16.10.1/24(网关地址)     
(源mac地址,网关mac地址)(源IP地址,目标IP地址)
  • 4.3.6 小总结
总结:
mac地址:用来标识局域网内的唯一一台机器
IP地址:帮忙定位计算机属于哪一个子网/局域网

IP+mac地址:可以标识全世界范围内独一无二的一台计算机
或者:IP地址可以标识全世界范围内独一无二的一台计算机

4.4 传输层

  • 4.4.1 传输层介绍
由来:网络层的IP区分局域网,以太网层mac查找主机,那么,如何标识计算机上的应用程序呢?答案就是端口,端口就是应用程序与网卡关联的编号。
功能:建立端口到端口的通信
补充:端口范围0-65535,0-1023为系统占用端口
  • 4.4.2 TCP协议
可靠传输,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割。

规定:基于TCP通信协议,客户端与服务端必须建立一个双向通信的'通道'
基于TCP通信协议:
	建立连接:客户端与服务端必须建立一个双向通信的'通道'---三次握手
	断开连接:断开'通道'---四次挥手

  • 三次握手与四次挥手图解

  • 三次握手---通俗版(你向你的女神表白
举个栗子:把客户端比作男孩,服务器比作女孩。用他们的交往来说明“三次握手”过程:

(1)男孩喜欢女孩,于是写了一封信告诉女孩:我爱你,请和我交往吧!;写完信之后,男孩焦急地等待,因为不知道信能否顺利传达给女孩。

(2)女孩收到男孩的情书后,心花怒放,原来我们是两情相悦呀!于是给男孩写了一封回信:我收到你的情书了,也明白了你的心意,其实,我也喜欢你!我愿意和你交往!;

写完信之后,女孩也焦急地等待,因为不知道回信能否能顺利传达给男孩。

(3)男孩收到回信之后很开心,因为发出的情书女孩收到了,并且从回信中知道了女孩喜欢自己,并且愿意和自己交往。然后男孩又写了一封信告诉女孩:你的心意和信我都收到了,谢谢你,还有我爱你!

女孩收到男孩的回信之后,也很开心,因为发出的情书男孩收到了。由此男孩女孩双方都知道了彼此的心意,之后就快乐地交流起来了~~
  • 三次握手理论版
1 客户端向服务端发送一段TCP报文---请求连接
	标记位:SYN,表示请求建立连接
	序号:seq=x
	客户端进入SYN_SENT阶段
2 服务端从半连接池中取出来自客户端的连接请求,结束LISTEN状态,返回一段TCP报文给客户端:
	标记位:ACK=x+1:表示确认收到了客户端的连接序列号seq=x,并将x+1作为确认号返回给客户端
	标记位:SYN(seq=y):确认收到连接请求的同时,向客户端发送连接请求,序号为seq=y
	客户端进入EATABLISHED阶段,服务端进入SYN_RCVD阶段
3 客户端接收到从服务端发送的确认收到收到请求的结果(ACK=x+1)及服务端发起的连接请求(SYN seq=y),并向服务端发送确认连接。
	标记位:ACK=y+1,表示确认收到了服务端的连接请求seq=y,并建立连接,将y+1作为确认号返回给服务端
	服务端进入EATABLISHED阶段

  • 进行三次握手的原因
为了防止服务器端开启一些无用的连接增加服务器开销以及防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。
也可以这样理解:“第三次握手”是客户端向服务器端发送数据,这个数据就是要告诉服务器,客户端有没有收到服务器“第二次握手”时传过去的数据。若发送的这个数据是“收到了”的信息,接收后服务器就正常建立TCP连接,否则建立TCP连接失败,服务器关闭连接端口。由此减少服务器开销和接收到失效请求发生的错误。

由于网络传输是有延时的(要通过网络光纤和各种中间代理服务器),在传输的过程中,比如客户端发起了SYN=1创建连接的请求(第一次握手)。

如果服务器端就直接创建了这个连接并返回包含SYN、ACK和Seq等内容的数据包给客户端,这个数据包因为网络传输的原因丢失了,丢失之后客户端就一直没有接收到服务器返回的数据包。

客户端可能设置了一个超时时间,时间到了就关闭了连接创建的请求。再重新发出创建连接的请求,而服务器端是不知道的,如果没有第三次握手告诉服务器端客户端收的到服务器端传输的数据的话,

服务器端是不知道客户端有没有接收到服务器端返回的信息的。
  • 数据传输阶段
1 客户端发送通过连接发送请求---需要数据
	标记位:SYN,表示需要数据
	序号:seq=x+1 
2 服务端确认请求,将客户端需要的数据返回给客户端
	标记位:ACK
	序号:ACK=x+2
  • 四次挥手的通俗理解

把客户端比作男孩,服务器比作女孩。通过他们的分手来说明“四次挥手”过程。

"第一次挥手":日久见人心,男孩发现女孩变成了自己讨厌的样子,忍无可忍,于是决定分手,随即写了一封信告诉女孩。
“第二次挥手”:女孩收到信之后,知道了男孩要和自己分手,怒火中烧,心中暗骂:你算什么东西,当初你可不是这个样子的!于是立马给男孩写了一封回信:分手就分手,给我点时间,我要把你的东西整理好,全部还给你!男孩收到女孩的第一封信之后,明白了女孩知道自己要和她分手。随后等待女孩把自己的东西收拾好。
“第三次挥手”:过了几天,女孩把男孩送的东西都整理好了,于是再次写信给男孩:你的东西我整理好了,快把它们拿走,从此你我恩断义绝!
“第四次挥手”:男孩收到女孩第二封信之后,知道了女孩收拾好东西了,可以正式分手了,于是再次写信告诉女孩:我知道了,这就去拿回来!
这里双方都有各自的坚持。
女孩自发出第二封信开始,限定一天内收不到男孩回信,就会再发一封信催促男孩来取东西!
男孩自发出第二封信开始,限定两天内没有再次收到女孩的信就认为,女孩收到了自己的第二封信;若两天内再次收到女孩的来信,就认为自己的第二封信女孩没收到,需要再写一封信,再等两天…..

倘若双方信都能正常收到,最少只用四封信就能彻底分手!这就是“四次挥手”。
  • 四次握手的理论版
1 首先客户端想要断开连接,向服务器端发送一段TCP报文--请求断开连接
	标记位:FIN,表示请求断开连接
	序号:seq=x+2
	客户端此时处于FIN_WAIT_1阶段,即半关闭状态,停止客户端向服务端发送数据,但是服务端仍然能够向客户端发送数据。
2 服务端接收到从客户端发出的TCP报文即断开连接请求,服务端会返回确认收到客户端想要关闭连接
	标记位:ACK:表示收到客户端的断开连接请求
	序号:ACK=x+3
	服务端由ESTABLISHED状态进入CLOSE_WAIT半关闭状态,并开始准备释放服务端到客户端的连接
	客户端结束FIN_WAIT_1阶段,进入FIN_WAIT_2阶段
3 服务端向客户端传输数据已完成,再次向客户端发送断开连接的请求
	标记位:FIN
	序号:seq=y+1
	服务端结束CLOSE_WAIT状态,进入LAST_ACK状态,并停止服务端到客户端的数据传输,但是客户端可以向服务端传输数据(前提是客户端通向服务端的连接没有关闭)
4 客户端接收从服务端发出的TCP报文,确认了服务端已经做好断开连接的准备,向服务端发送确认断开连接的报文
	标记位:ACK:表示接收到服务端断开连接的请求
	序号:ACK=y+2
	客户端结束FIN_WAIT_2阶段,进入TIME_WAIT阶段,随后客户端开始在TIME_WAIT阶段等待2MSL
	服务器端收到从客户端发出的TCP报文之后结束LAST-ACK阶段,进入CLOSED阶段。由此正式确认关闭服务器端到客户端方向上的连接。

客户端等待完2MSL之后,结束TIME-WAIT阶段,进入CLOSED阶段,由此完成“四次挥手”。
  • 为什么要等待2MSL
为的是确认服务器端是否收到客户端发出的ACK确认报文

当客户端发出最后的ACK确认报文时,并不能确定服务器端能够收到该段报文。所以客户端在发送完ACK确认报文之后,会设置一个时长为2MSL的计时器。MSL指的是Maximum Segment Lifetime:一段TCP报文在传输过程中的最大生命周期。2MSL即是服务器端发出为FIN报文和客户端发出的ACK确认报文所能保持有效的最大时长。

服务器端在1MSL内没有收到客户端发出的ACK确认报文,就会再次向客户端发出FIN报文;

如果客户端在2MSL内,再次收到了来自服务器端的FIN报文,说明服务器端由于各种原因没有接收到客户端发出的ACK确认报文。客户端再次向服务器端发出ACK确认报文,计时器重置,重新开始2MSL的计时;
否则客户端在2MSL内没有再次收到来自服务器端的FIN报文,说明服务器端正常接收了ACK确认报文,客户端可以进入CLOSED阶段,完成“四次挥手”。

所以,客户端要经历时长为2SML的TIME-WAIT阶段;这也是为什么客户端比服务器端晚进入CLOSED阶段的原因
  • 为什么握手是三次挥手是四次
TCP建立连接时之所以只需要"三次握手",是因为在第二次"握手"过程中,服务器端发送给客户端的TCP报文是以SYN与ACK作为标志位的。SYN是请求连接标志,表示服务器端同意建立连接;ACK是确认报文,表示告诉客户端,服务器端收到了它的请求报文。

即SYN建立连接报文与ACK确认接收报文是在同一次"握手"当中传输的,所以"三次握手"不多也不少,正好让双方明确彼此信息互通。

TCP释放连接时之所以需要“四次挥手”,是因为FIN释放连接报文与ACK确认接收报文是分别由第二次和第三次"握手"传输的。为何建立连接时一起传输,释放连接时却要分开传输?

建立连接时,被动方服务器端结束CLOSED阶段进入“握手”阶段并不需要任何准备,可以直接返回SYN和ACK报文,开始建立连接。释放连接时,被动方服务器,突然收到主动方客户端释放连接的请求时并不能立即释放连接,因为还有必要的数据需要处理,所以服务器先返回ACK确认收到报文,经过CLOSE-WAIT阶段准备好释放连接之后,才能返回FIN释放连接报文。

所以是“三次握手”,“四次挥手”。

4.5 应用层

  • 应用层介绍
由来:用户使用的都是应用程序,均工作于应用层,互联网是开发的,大家都可以开发自己的应用程序,数据多种多样,必须规定好数据的组织形式 
功能:规定应用程序的数据格式。
  • 应用层的协议
 CS架构可以自定义应用层协议---》头部+数据部分
 BS架构应用层协议---》浏览器的应用层协议(http https。。。。)
  • 自定义协议需要注意的问题
1 两大组成部分 = 头部+数据部分
    头部:放对数据的描述信息
        比如:数据要发给谁,数据类型,数据长度
    数据:想要发的数据
2 头部长度必须固定
    因为接收端要通过头部获取所接收数据的详细信息

五 网络通信实现

5.1 每台主机实现网络通信的要素

  • 本机的IP地址
  • 子网掩码
  • 网关的IP地址
  • DNS的IP地址

5.2 获取上述要素的方式

  • 1 静态获取---手动配置
  • 2 动态获取---通过DHCP获取
以太网头 IP头 UDP头 DHCP数据包
1 最前面的”以太网标头”,设置发出方(本机)的MAC地址和接收方(DHCP服务器)的MAC地址。前者就是本机网卡的MAC地址,后者这时不知道,就填入一个广播地址:FF-FF-FF-FF-FF-FF。
(2)后面的”IP标头”,设置发出方的IP地址和接收方的IP地址。这时,对于这两者,本机都不知道。于是,发出方的IP地址就设为0.0.0.0,接收方的IP地址设为255.255.255.255。

 

(3)最后的”UDP标头”,设置发出方的端口和接收方的端口。这一部分是DHCP协议规定好的,发出方是68端口,接收方是67端口。

 

这个数据包构造完成后,就可以发出了。以太网是广播发送,同一个子网络的每台计算机都收到了这个包。因为接收方的MAC地址是FF-FF-FF-FF-FF-FF,看不出是发给谁的,所以每台收到这个包的计算机,还必须分析这个包的IP地址,才能确定是不是发给自己的。当看到发出方IP地址是0.0.0.0,接收方是255.255.255.255,于是DHCP服务器知道”这个包是发给我的”,而其他计算机就可以丢弃这个包。

 

接下来,DHCP服务器读出这个包的数据内容,分配好IP地址,发送回去一个”DHCP响应”数据包。这个响应包的结构也是类似的,以太网标头的MAC地址是双方的网卡地址,IP标头的IP地址是DHCP服务器的IP地址(发出方)和255.255.255.255(接收方),UDP标头的端口是67(发出方)和68(接收方),分配给请求端的IP地址和本网络的具体参数则包含在Data部分。

 

新加入的计算机收到这个响应包,于是就知道了自己的IP地址、子网掩码、网关地址、DNS服务器等等参数

六 网络通信流程

6.1 本机获取

  • 本机的IP地址:192.168.1.100
  • 子网掩码:255.255.255.0
  • 网关的IP地址:192.168.1.1
  • DNS的IP地址:8.8.8.8

6.2 打开浏览器

  • 想要访问Google,在地址栏输入了网址:www.google.com。

6.3 dns协议(基于UDP协议)

13台根dns:

A.root-servers.net198.41.0.4美国
B.root-servers.net192.228.79.201美国(另支持IPv6)
C.root-servers.net192.33.4.12法国
D.root-servers.net128.8.10.90美国
E.root-servers.net192.203.230.10美国
F.root-servers.net192.5.5.241美国(另支持IPv6)
G.root-servers.net192.112.36.4美国
H.root-servers.net128.63.2.53美国(另支持IPv6)
I.root-servers.net192.36.148.17瑞典
J.root-servers.net192.58.128.30美国
K.root-servers.net193.0.14.129英国(另支持IPv6)
L.root-servers.net198.32.64.12美国
M.root-servers.net202.12.27.33日本(另支持IPv6)

 

域名定义:http://jingyan.baidu.com/article/1974b289a649daf4b1f774cb.html

顶级域名:以.com,.net,.org,.cn等等属于国际顶级域名,根据目前的国际互联网域名体系,国际顶级域名分为两类:类别顶级域名(gTLD)和地理顶级域名(ccTLD)两种。类别顶级域名是                    以"COM"、"NET"、"ORG"、"BIZ"、"INFO"等结尾的域名,均由国外公司负责管理。地理顶级域名是以国家或地区代码为结尾的域名,如"CN"代表中国,"UK"代表英国。地理顶级域名一般由各个国家或地区负责管理。

二级域名:二级域名是以顶级域名为基础的地理域名,比喻中国的二级域有,.com.cn,.net.cn,.org.cn,.gd.cn等.子域名是其父域名的子域名,比喻父域名是abc.com,子域名就是www.abc.com或者*.abc.com.
一般来说,二级域名是域名的一条记录,比如alidiedie.com是一个域名,www.alidiedie.com是其中比较常用的记录,一般默认是用这个,但是类似*.alidiedie.com的域名全部称作是alidiedie.com的二级

6.4 HTTP部分的内容

GET / HTTP/1.1
Host: www.google.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.1) ……
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8
Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3
Cookie: … …

 

我们假定这个部分的长度为4960字节,它会被嵌在TCP数据包之中。

6.5 TCP协议

TCP数据包需要设置端口,接收方(Google)的HTTP端口默认是80,发送方(本机)的端口是一个随机生成的1024-65535之间的整数,假定为51775。

TCP数据包的标头长度为20字节,加上嵌入HTTP的数据包,总长度变为4980字节。

6.6 IP协议

然后,TCP数据包再嵌入IP数据包。IP数据包需要设置双方的IP地址,这是已知的,发送方是192.168.1.100(本机),接收方是172.194.72.105(Google)。

IP数据包的标头长度为20字节,加上嵌入的TCP数据包,总长度变为5000字节。

6.7 以太网协议

最后,IP数据包嵌入以太网数据包。以太网数据包需要设置双方的MAC地址,发送方为本机的网卡MAC地址,接收方为网关192.168.1.1的MAC地址(通过ARP协议得到)。

以太网数据包的数据部分,最大长度为1500字节,而现在的IP数据包长度为5000字节。因此,IP数据包必须分割成四个包。因为每个包都有自己的IP标头(20字节),所以四个包的IP数据包的长度分别为1500、1500、1500、560。

6.8 服务器端相应

经过多个网关的转发,Google的服务器172.194.72.105,收到了这四个以太网数据包。

根据IP标头的序号,Google将四个包拼起来,取出完整的TCP数据包,然后读出里面的”HTTP请求”,接着做出”HTTP响应”,再用TCP协议发回来。

本机收到HTTP响应以后,就可以将网页显示出来,完成一次网络通信。
posted @ 2020-04-16 22:59  微信搜索-程序媛小庄  阅读(238)  评论(0编辑  收藏  举报