互联网通信协议
- 协议其实就是规定了一堆标准,用来定义计算机如何接入
internet
以及接入internet
的计算机通信的标准;所以计算机都需要学习此标准、遵循此标准来进行信息传输(信息通信) ; - 国际标准化组织:推出了
OSI
七层参考模型,将互联网通讯协议分成了不同的层,每一层都有专门的标准,以及组织数据的格式;- (应、表、会、传、网、数、物)
- 对于写程序来说,通常会将七层归纳为五层协议;
- (应、传、网、数、物)
- 所以我们需要学习协议的规定了哪些标准;
# 物理层
物理层:定义物理设备的标准,如网卡网线,传输速率;最终实现数据转成电信号传输;
问题:如果只是单纯发送电信号是没有意义的,因为没有规定开头也没有规定结尾;要想变得有意义就必须对电信号进行分组;比如:xx位为一组、这样的方式去传输,这就需要“数据链路层"来完成了;
# 数据链路层
- 数据链路层定义:定义了电信号的分组的标准方式,一组数据称之为一个数据帧,这个标准遵循
ethernet
以太网协议,以太网规定了如下几件事; - 1.数据帧分为
head
和data
两部分组成;其中head
长度固定18字节;head
:发送者/源地址、接收者/目标地址(源地址6字节、目标地址6字节、数据类型6字节)- 源地址:
MAC
地址 - 目标地址:
MAC
地址
- 源地址:
data
:主要存放是网络层整体的数据,最长1500字节,超过最大限制就分片发送;
- 2.但凡接入互联网的主机必须有一块网卡,网卡烧制了全世界唯一的
MAC
地址; - 3.有了以太网协议规定以后,它能对数据分组、也可以区分数据的意义,还能找到目标主机的地址、就可以实现计算机通信;但是计算机是瞎的,所以以太网通信采用的是"广播"方式;
- 那什么是广播:
- 假设我们都在一个小黑屋里面,大家互相通信靠吼,假设
李雷
让韩梅梅
买包烟;- 1.数据:买烟(类型:干粮)
- 2.源地址:李雷
- 3.目标地址:韩梅梅
- 此时屋子里所有人都收到了该数据包,但只有
韩梅梅
会接收执行,其他人收到后会丢弃;
- 假设我们都在一个小黑屋里面,大家互相通信靠吼,假设
- 如果我们将全世界的计算机都接入在一起,理论上是不是就可以实现全世界通信:
- 首先:无法将全世界计算机放在一个交换机上,因为没有这样的设备;
- 其次:就算放在同一设备上,每台计算机都广播一下,那设备也无法正常工作;
- 所以:我们应该将主机划区域,隔离在一个又一个的区域中,然后将多个区域通过"网关/路由"连接在一起;
# 网络层
- 网络层定义:用来划分广播域,如果广播域内主机要往广播域外的主机发送数据,一定要有一个"网关/路由"帮其将数据转发到外部计算机;网关和外界通信走的是路由协议(这个我们不做详细阐述)。其次网络层协议规定了如下几件事;
- 规定1:数据包分成:
head
和data
两部分组成;head
:发送者/源地址、接收者/目标地址,该地址为IP地址;data
:主要存放是传输层整体的数据;
- 规定2:
IP
地址来划分广播域,主要用来判断两台主机是否在同一广播域中;- 一个合法
IPV4
地址组成部分=ip地址/子网掩码
,在线子网计算器 (opens new window) - 如果计算出两台地址的广播域一样,说明两台计算机处在同一个区域中;
- 一个合法
- 规定1:数据包分成:
- 计算两台计算机是否在同一局域网(牵扯到如何发送数据):
- 假设:现在计算机1要与计算机2通信,计算机1必须拿到计算机2的IP地址;
- 如果它们处于同一网络(局域网)
10.0.0.1-->10.0.0.100
:- 1.本地电脑根据数据包检查目标IP如果为本地局域网;
- 2.直接通过交换机广播MAC寻址;将数据包转发过去;
- 如果它们处于不同网络(跨局域网)
10.0.0.1-->39.104.16.126
:- 1.本地根据数据包检查目标
IP
如果不为本地局域网,则尝试获取网关的MAC
地址; - 2.本地封装数据转发给交换机,交换机拆解发现目标
MAC
是网关,则送往网关设备; - 3.网关收到数据包后,拆解至二层后发现请求目标
MAC
是网关本机MAC
; - 4.网关则会继续拆解数据报文到三层,发现目标地址不为网关本机;
- 5.网关会重新封装数据包,将源地址替换为网关的
WAN
地址,目标地址不变; - 6.出口路由器根据自身路由表信息将数据包发送出去,直到送到目标的网关;
- 1.本地根据数据包检查目标
- 如果它们处于同一网络(局域网)
# 传输层
- 传输层的由来:网络层帮我们区分子网,数据链路层帮我们找到主机,但一个主机有多个进程,进程之间进行不同的网络通信,那么当收到数据时,如何区分数据是那个进程的呢;其实是通过端口来区分;端口即应用程序与网卡关联的编号。
- 传输层的定义:提供进程之间的逻辑通信;
- 传输层也分成:
head
和data
两部分组成;head
:源端口、目标端口、协议(TCP、UDP);data
:主要存放是应用层整体的数据;
# 应用层
- 应用层定义:为终端应用提供的服务,如我们的浏览器交互时候需要用到的HTTP协议,邮件发送的SMTP,文件传输的FTP等。
# TCP协议
- tcp可靠数据传输协议;为了实现可靠传输,在通信之前需要先建立连接,也叫“双向通路",就是说客户端与服务端要建立连接,服务端与客户端也需要建立连接,当然建立的这个双向通路它只是一个虚拟的链路,不是用网线将两个设备真实的捆绑在一起;
- 虚拟链路的作用:由于每次通信都需要拿到IP和Port,那就意味着每次都需要查找,建立好虚拟通路,下次两台主机之间就可以直接传递数据;
# 三次握手
- 第一次:客户端要与服务端建立连接,需要发送请求连接消息;
- 第二次:服务端接收到数据后,返回一个确认操作(至此客户端到服务端链路建立成功) ;
- 第三次:服务端还需要发送要与客户端建立连接的请求;
- 第四次:客户端接收到数据后,返回一个确认的操作(至此服务端到客户端的链路建立成功);
- 由于建立连接时没有数据传输,所以第二次确认和第三次请求可以合并为一次发送;
- TCP协议为了实现可靠传输,通信双方需要判断自己已经发送的数据包是否都被接收方收到,如果没收到,就需要重发。为了实现这个需求,就引出序号(seq) 和确认号(ack)的使用。
- 举例:发送方在发送数据包时,序列号(假设为123),那么接收方收到这个数据包以后,就可以回复一个确认号(124=123+1)告诉发送方“我已经收到了你的数据包,你可以发送下一个数据包,序号从124开始”,这样发送方就可以知道哪些数据被接收到,哪些数据没被接收到,需要重发。
# 四次挥手
- 第一次挥手:客户端(服务端也可以主动断开)向服务端说明想要关闭连接;
- 第二次挥手:服务端会回复确认。但不是立马关闭,因为此时服务端可能还有数据在传输中;
- 第三次挥手:待到服务端数据传输都结束后,服务端向客户端发出消息,我要断开连接了;
- 第四次挥手:客户端收到服务端的断开信息后,给予确认。服务端收到确认后正式关闭。
# 转换状态
- 三次握手状态转换:
- 1.客户端发送
SYN
包向服务端请求建立TCP
连接,客户端进入SYN_SEND
状态; - 2.服务端收到请求之后,向客户端发送
SYN+ACK
的合成包,同时自身进入SYN_RECV
状态; - 3.客户端收到回复之后,发送
ACK
信息,自身进入ESTABLISHED
状态; - 4.服务端收到
ACK
数据之后,进入ESTABLISHED
状态。
- 1.客户端发送
- 四次挥手过状态转换:
- 1.客户端发送完数据之后,向服务器请求断开连接,自身进入
FIN_WAIT_1
状态; - 2服务端收到
FIN
包之后,回复ACK
包表示已经收到,但此时服务端可能还有数据没发送完成,自身进入CLOSE_WAIT
状态,表示对方已发送完成且请求关闭连接,自身发送完成之后可以关闭连接; - 3.服务端数据发送完成后,发送
FIN
包给客户端,自身进入LAST_ACK
状态,等待客户端ACK
确认; - 4.客户端收到
FIN
包之后,回复一个ACK
包,并进入TIME_WAIT
状态; - 注意:
TIME_WAIT
状态比较特殊,当客户端收到服务端的FIN
包时,理想状态下,是可以直接关闭连接了;但是有几个问题:- 问题1:网络是不稳定的,可能服务端发送的一些数据包,比服务端发送的
FIN
包还晚到; - 问题2:如果客户端回复的
ACK
包丢失了,服务端就会一直处于LAST_ACK
状态,如果客户端没有关闭,那么服务端还会重传FIN
包,然后客户端继续确认;
- 问题1:网络是不稳定的,可能服务端发送的一些数据包,比服务端发送的
- 所以客户端如果
ACK
后立即关闭连接,会导致数据不完整、也可能造成服务端无法释放连接。所以此时客户端需要等待2个报文生存最大时长,确保网络中没有任何遗留报文了,再关闭连接; - 如果机器
TIME_WAIT
过多,会造成端口会耗尽,可以修改内核参数tcp_tw_recycle=1
端口重用;
- 1.客户端发送完数据之后,向服务器请求断开连接,自身进入
# UDP协议
udp
是不可靠传输协议;不可靠指的是传输数据时不可靠;udp
协议不需要先建立连接,只需要获取服务端的ip+port
,发送完毕也无需服务器返回ack
;udp
协议如果在发送在数据的过程中丢了,那就丢了;
Last Updated: 2024/03/29, 17:39:25