进程间通讯解决的是本机内的通讯,而网络通信解决的是任意不同机器间的通讯
网卡:PC机自带
路由器,交换机
光纤、电缆、基站
通信协议是指双方实体完成通信或者服务所必须遵循的规则和约定。协议定义了 数据单元使用的格式,信息单元该包含的信息和含义,连接方式,信息发送和接收的时序,从而确保网络中数据顺利地传输到正确的地方。
作用是什么:在计算机通信中,通讯协议用于实现计算机与网络连接之间的标准,网络如果没有统一的通讯协议,电脑之间的信息传递就无法识别。
字面意思就是:物理传输、硬件、物理特性。在不同地方的人使用qq聊天,电脑必须得联网吧。那么在物理上就是要接根网线,再插个路由器。也就是说计算机与计算机之间的通讯,必须要有底层物理层方面的连接,类似于打电话,中间要插电话线一样。
物理层需要将通信介质的信号转换到数字信号(二进制0101)。然而如何使这些二进制位有具体意思呢?这就需要人为的分组,8位一组,发送及接收都按照8位一组来划分。如果没有分组的话,对方接收的计算机根本就不知道传过来的数据从哪位开始计算,那就解析不了这些数据了。因此要想让底层的数字信号有意义,那就必须将其分组。那么分组的活,哪层干呢?这时候就用到了数据链路层!
很早之前,数据链路层就是用来对数字信号进行分组的。以前每个公司都有自己的分组方式,非常的乱。后来就形成了统一的标准(标准就是协议),也就是以太网协议Ethernet。
以太网协议规定:
一组数字信号称之为一个数据包,或者叫做一“帧”。
每一个数据包包含两部分:head报头、data数据两部分。
其中head包含:发送者(源地址,6个字节)、接收者(目标地址,6个字节)、数据类型(6个字节)。所以head报头固定是18个字节。
data包含:数据包的具体内容(最短46字节,最长1500字节)
head长度+data长度=最短64字节,最长1518字节,超过最大长度就分片发送。
在计算机通信中源地址和目标地址都是指的是mac地址。
Mac地址的由来:
以太网协议规定接入互联网的设备都必须具备网卡,发送端和接收端的地址便是指网卡地址,即Mac地址。
每块网卡出厂时都被烧录上一个实际上唯一的Mac地址,长度是48位2进制,通常由12位16进制数表示。有了mac地址以后,计算机就可以通信了。
交换机:
交换机是一种用于电(光)信号转发的网络设备。它可以为接入交换机的任意两个网络节点提供独享的电信号通路
交换机工作原理:
交换机根据收到数据帧中的源MAC地址建立该地址同交换机端口的映射,并将其写入MAC地址表中
交换机将数据帧中的目的MAC地址同已建立的MAC地址表进行比较,以决定由哪个端口进行转发
如数据帧中的目的MAC地址不在MAC地址表中,则向所有端口转发。这一过程称为泛洪(flood)
数据链路层将我的mac地址和接收者mac地址以及我发送的内容包装成一个数据包之后就往外发,到物理层以后就全部转换成二进制,那么怎么往外发呢?广播!计算机底层,只要在一个局域网中,都是靠广播。
什么是互联网,互联网就是由一个个局域网组成。局域网内计算机不管是对内还是对外都是靠广播,这就是数据链路层的工作方式——广播!
广播出去以后,所有计算机都能接收到,所有计算机都会拆开这个包,读发送者是谁,只要接收者mac地址不是自己就丢弃掉,而目标计算机接收到,就会将我需要的信息发送回来,同样采用的是广播方式。
然而当不在同一个局域网中时,如何通信呢?这就是跨网络进行通信,数据链路层就解决不了这个问题了。这时候就需要网络层出手了!
网络层定义了一个IP协议
IP地址,路由器(通过公网ip来访问全世界)
IP地址:实际上是32位二进制数(01100100.00000100.00000101.00000110)100.4.5.6
公网IP(广域网通信):
a类:1.0.0.1~126.255.255.254
** b类:128.0.0.1~191.255.255.254**
** c类:192.0.0.1~223.255.255.254**
d类:224.0.0.1~239.255.255.254
** e类:240.0.0.1~255.255.255.254**
A:10.0.0.0~10.255.255.255
** B:172.16.0.0~172.31.255.255**
** C:192.168.0.0~192.168.255.255**
传输层的由来:网络层的ip帮我们区分子网,以太网层的mac帮我们找到主机,然后大家使用的都是应用程序,你的电脑上可能同时开启qq,微信,等多个应用程序
那么我们通过ip和mac找到了一台特定的主机,如何标识这台主机上的应用程序,答案就是端口,端口即应用程序与网卡关联的编号。
传输层功能:建立端口到端口的通信
补充:端口范围0-65535,0-1023为系统占用端口
TCP协议(传输控制协议):
特点:面向链接、可靠的字节流传输
字节流传输:优点:无需一次存储过大的数据占用太多内存。缺点:坏处就是无法知道这些字节代表的意义,导致粘包及拆包的问题
TCP的可靠传输:
停止等待协议:A给B发包,B回复收到,A继续发下一个包。每次发送都可能丢包,如果丢失,B永远无法回复A,A一直等待。
超时重传:
A发出包开始计时,若时间到未收到回复,则认为包丢失,再次发送、重传。若包没有丢失,等待时间较长。B会收到两个包,无法识别。
序号和确认号:
表示发送方数据第一个字节的编号,和接收方期待的下一份数据的第一个字节的编号
连续ARQ协议:
为什么要有连续ARQ协议:
停止等待满足可靠传输,但效率太低,等待过程中浪费资源
解决方法:
连续发送数据包,A源源不断的发送,B源源不断的接收,并逐一回复,累计确认:累积收到一定数量,回去之前的包全部收到。如果有包A未收到回复,那么重传
缺点:发送太快导致接收方无法接受,便频繁进行重传,浪费网络资源
如何处理丢包问题
选择确认SACK:在TCP报文的选项字段,可以设置已收到的报文段,每个报文段需要两个边界来进行确定
滑动窗口:
发送方需要根据接收方的缓冲区大小,设置自己的可发送的窗口大小,处于窗口内的数据表示可发送,之外的数据不可发送。
当窗口内的数据接收到确认回复时,整个窗口会往前移动,直到发送完成所有的数据当窗口内的数据接收到确认回复时,整个窗口会往前移动,直到发送完成所有的数据
可靠传输小结:
通过连续ARQ协议与发送-确认回复模式来保证每一个数据包都能到达接收方
通过给字节编号的方法来标记每个数据是属于重传还是新的数据
通过超时重传的方式来解决数据包在网络中丢失的问题
通过滑动窗口来实现流量控制
通过累计确认 + 选择确认的方法来提高确认回复与重传的效率
拥塞控制:
作用:避免网络过分拥挤导致丢包严重,网络效率降低
拥塞控制 VS 流量控制
流量控制是拥塞控制的手段:为了避免阻塞,必须对流量进程控制
拥塞控制的目的是:限制每个主机的发送的数据量,避免网络拥塞效率下降
解决方法:
拥塞控制的解决方法是流量控制,流量控制的实现是滑动窗口
拥塞控制最终于是通过限制发送方的滑动窗口大小来限制流量
拥塞控制的4个重点:慢开始、快恢复、快重传、拥塞避免
解决原理:
最开始的时候,会把窗口设置一个较小的值,然后每轮变为原来的两倍。这是慢开始
当窗口值到达ssthresh值,这个值是需要通过实时网络情况设置的一个窗口限制值,开始进入拥塞避免,每轮把窗口值提升1,慢慢试探网络的底线
如果发生了数据超时,表示极可能发生了拥塞,然后回到慢开始,重复上面的步骤
如果收到三个相同的确认回复,表示现在网络的情况不太好,把ssthresh的值设置为原来的一半,继续拥塞避免。这部分称为快恢复
如果收到丢包信息,应该尽快把丢失的包重传一次,这是快重传
面向链接:
链接:
链接不是实实在在的链接,而是通信双发彼此之间的一个记录
TCP是一个全双工通信,也就是可以互相发送数据,所以双发都需要记录对方的信息(源IP、源端口号、目标端口号)
建立链接:
目的:交换彼此的信息,然后记住对方的信息
三次握手:
机器A发送syn包,向机器B请求建立TCP链接,并附加上自身的接收缓冲区信息等,机器A进入SYN_SEND状态,表示请求已经发送正在等待回复
机械B收到请求之后,根据机器A的信息记录下来,并创建自身的接收缓存区,向机械A发送syn + ack的合成包,同时自身进入SYN_RECV状态,表示已经准备好了
机器A收到回复之后记录机器B的信息,发送ack信息,自身进入ESTABLISHED状态,,表示已经完全准备好了,可以进行发送和接收
机器B收到ACK数据后,进入ESTABLISHED状态
三次消息的发送,称之为三次握手
拒绝服务攻击(DOS):
通过各种技术手段导致目标系统进入拒绝服务状态的攻击。
分布式拒绝服务攻击:
利用合理的请求曹成资源过载,导致服务不可用,从而曹正服务器拒绝正常流量服务。
SYN_Flood攻击:
就是让客户端不返回最后的ACK包,这就形成了半开连接,TCP半开连接是指发送或者接受了TCP连接请求,等待对方应答的状态,半开连接状态需要占用系统资源以等待对方应答,半开连接数达到上限,无法建立新的连接,从而造成拒绝服务攻击。
断开链接:
四次挥手:
机器A发送完数据之后,向机械B请求断开链接,自身进入FIN_WAIT_1状态,表示数据发送完成且已经发送FIN包(FIN标志位为1)
机械B收到FIN包之后,回复ack包,表示已经收到,但此时,机械B可能还有数据没发送完成,自身进入CLOSE_WAIT状态,表示对方已发送完成且请求关闭链接,自身发送完成之后可以关闭链接
机械B发送完数据后,发送FIN包给机器A,自身进入LAST_ACK状态,表示等待一个ACK包即可关闭链接
机器A收到FIN包之后,知道机器B也发送完成了,回复一个ACK包。并进入TIME_WAIT状态
机器A等待两个报文存货最大时长之后,机器B接收到ACK报文之后,均关闭链接,进入CLASED状态
TIME_WAIT状态:
当机器A收到机器B的FIN包时,理想状态下,确实是可以直接关闭链接了
问题1:当网络不稳定时,可能机器B放了一些数据还没到(比FIN包慢)
问题2:同时回复的ACK包可能丢失,机械B会重传FIN包
问题3:此时机械A马上关闭链接,导致数据不完整、机械B无法释放链接等问题|机器A收到FIN包之后,知道机器B也发送完成了,回复一个ACK包。并进入TIME_WAIT状态
解决方法:此时机器A需要等待两个报文生存最大时长,确保网络中没有任何遗留报文了,再关闭链接
应用层需要向母校进程发送两份数据,一份音频,一份文本
TCP只知道接受到一个流,并把流拆分成4段进行发送
中间第二个报文的数据就出现两个文件的数据混在一起,称为粘包
目标进用层在接收到数据之后,需要把这些数据拆分成正确的两个文件,就是拆包
粘包与拆包都是应用层需要解决的问题,可以再每个文件的最后附加上一些特殊字符,如换行符
UDP协议(用户数据报协议):
无连接无可靠传输:
UDP传送数据前并不与对方建立链接,对接受的数据也不发送确认信号,发送端不知道数据是否会正确接受,不需要重发
UDP中的每个数据包都是一个独立的信息,包括完成的源或目的地址,他在网络上以任何可能的路径传目的地,对于能否达到目的地,达到目的地的时间以及内容的正确性都是不能被保证的
因为UDP不必进行收发数据的确认,而且资源消耗小,处理速度快,所以他的实时性更好,传送速率更高。
UDP的报文格式:
源端口、目标端口号:区分主机的不同进程
校验码:校验数据包在传输的过程中没有出现错误,例如某个1变成0
长度:报文的长度
UDP的功能:校验数据报是否发生错误,区分不同的进程通信
优点:
效率更快,无需建立链接以及拥塞状态
链接更多的用户,没有链接状态,不用为每个客户创建缓存等
分组首部字节少,开销小,TCP首部固定首部是20字节,而UDP只有8字节,更小的首部意味着更大比例的数据部分
在一些需要高效率允许的可限度误差的场景下可以使用,如直播场景
可以进行广播,UDP不是面向链接的,所以可以同时对多个进程进行发送报文。
缺点:
无法保证消息完整、正确到达,UDP是不可靠的传输协议
缺少拥塞控制,容易互相竞争资源,导致网络系统瘫痪
UDP适用场景:
视频直播、DNS、RIP路由选择协议
链接方式:TCP是面向链接,而UDP是无连接
可靠性:
TCP是可靠传输,适用流量控制和拥塞控制
UDP是不可靠传输,不适用流量控制和拥塞控制
链接对象的数量:
TCP只能是一对一通信
UDP支持一对一,一对多,多对一和多对多交互通信
传输方式:TCP是面向字节流,UDP是面向报文
首部开销:TCP首部最小20字节,最大60字节,UDP首部开销小,仅8字节
适用场景:
TCP适用于要求可靠传输的应用,例如文件传输
UDP适用于实时应用(IP电话、视频会议、直播等)
控制发包的数据
文件格式
会话层、表示层、应用层在Linux中合为应用层
应用层
DNS(Domain Name System:域名系统):
作用:解决IP地址复杂难以记忆的问题,存储并完成自己所管辖范围内主机的域名到IP地址的映射
域名解析的顺序:浏览器缓存,找本机的hosts文件,路由缓存,找DNS服务器(本地域名、顶级域名、根域名)->迭代解析、递归查询
域名由点、字母和数字组成:
顶级域(com,cn,net,gov,org)
二级域(baidu,taobao,qq,alibaba)
三级域(www)
优点:
用于客户端实现与服务器的直接相连,没有中间环节,因此影响速度快
操作界面漂亮、形式多样,可以充分满足客户自身的个性化要求
C/S结构的管理系统具有较强的事务处理能力,能实现复杂的业务流程
缺点:
需要专门的客户端安装程序,分布功能弱,针对点多面广且不具备网络条件的用户群体,不能够实现快速部署安装和配置。
兼容性差,对于不同的开发工具,具有较大的局限性。若采用不同工具,需要重新改写程序
开发成本较高,需要具有一定专业水准的技术人员才能完成