一 客户端/服务器端架构
CS架构:C客户端 -----------S服务器端
BS架构:B浏览器端----------S服务器端
二 网络通信原理:
什么是互联网?:想要进行跨距离传输信息是会发生语言不通的情况,那么我们就需要一个统一的语言标准来进行通信,
一系列统一的标准,这些标准称之为互联网协议,互联网的本质就是一系列的协议
互联网协议的功能:定义计算机如何接入internet,以及接入Internet的计算机通信的标准
osi七层协议:互联网协议按照功能不同分为osi七层或者tcp/ip五层或tcp/ip四层
应用层 应用层 应用层
表示层
会话层
传输层 传输层 传输层
网络层 网络层 网络层
网络接口层 数据链路层 数据链路层
物理层 物理层
每层常见设备:传输层 四层交换机 四层路由器
网络层 路由器 三层交换机
数据链路层 网桥 以太交换机 网卡
物理层 中继器 集线器 双绞线
osi七层协议数据传输其实就是一个封包与解包的过程,数据由应用三层传下,在传输层添加tcp或者udp报头(段)在网络层添加ip报头(包)
在数据链路层添加以太网头(帧)在物理层转换为相应的比特位(bite),解包过程相反
首先,用户感知到的只是最上面一层应用层,自上而下每层都依赖于下一层,所以我们从最下一层开始切入,比较好理解每层都运行特定的协议,
越往上越靠近用户,越往下越靠近硬件,我们只负责编辑应用层软件,剩下的交给socket套接字完成封包
三 网络基础详解:
根据上述的学习我们可以得知越向下越靠近硬件距离我们越远,因此,我们从最下层开始向上解释,O(∩_∩)O哈哈~惊不惊喜
1.物理层
用来计算机组网,主要是基于电器特性发送高低电压(电信号),高电压对应数字1,低电压对应数字0
2.数据链路层
由于物理层传输的是一串010101的电频信号,没有任何意义,所以数据链路层主要是定义了电信号的分组方式
以太网协议
早期规则并不统一,后来形成了统一的标准,以太网协议ethernet,规定一组电信号称之为一个帧,其中包括
head
发送者、源地址
接受者、目标地址
数据类型
data
数据包具体内容
MAC地址head中包含的源地址和目标地址都是什么?:根据规定每个连接如网络的设备都要有网卡,这两个地址就分别是两个目标的不同地址
mac地址:每块网卡出厂时都被烧制上一个世界唯一的mac地址,长度为48位2进制,通常由12位16进制数表示(前六位是厂商编号,后六位是流水线号)
既然了解了地址是什么,那么接下来就来聊一下计算机之间是如何通信的
在同一个网络中有多个计算机目标(小伙伴),发送数据的那台计算机就会在群里大叫,小伙伴们我要发送数据了,目标是xxxxx,同时群里的小伙伴都会收到
消息同时查看所获得的Mac地址是否与自己相匹配,如果不是就不鸟他如果是就扣1,这种基本靠吼的方式被我们称之为广播
通信之广播:
广而告之基本靠吼的通信方式被我们形象的称之为广播
3.网络层
再有了上述知识铺垫之后,我们可以再一个局域网内完成信息数据的传递,那么你在浏览网页,打游戏的时候数据的传输目标机器可不再你的局域网内,同时如果
我们将全世界的计算机都放入一个局域网内会出现世界上任何一台计算机广播的时候你都会收到它的吼声,二计算机的请求每分每秒可是一个大数量级,这就表明了通过以太网连接全世界不太靠谱。所以我们需要一种将局域网串联起来的东西
网络层的功能
引入一套新的地址用来区分不同的广播域/子网,这套地址即网络地址
IP协议
我们经常听到IP地址这种词汇,那么他究竟是什么?规定网络地址的协议叫ip协议,它定义的地址称之为ip地址,广泛采用的v4版本即ipv4
IP地址分为两个部分 网络部分:标识了子网,主机部分:标识了主机。
ps 单纯的ip地址段只是标识了ip地址的种类,从网络部分或主机部分都无法辨识一个ip所处的子网
子网掩码
如何确定两个地址是否属于同一个子网呢,这里就要介绍一下子网掩码的概念,所谓子网掩码就是子网络特征,通过子网掩码我们可以判断那些机器是在同一个子网中
判断子网
将两个地址分别与各自的子网掩码进行与运算(不知道与运算含义的自行百度),如果得到的结果是一致的那么恭喜你他们两个是一家
小总结
IP协议的作用主要有两个,一个是为每一台计算机分配IP地址,另一个是确定哪些地址在同一个子网络。
IP数据包
与其他网络数据包一致,我们IP大人的数据包也是分为两个部分head 和 data,注意这里的整个数据包是要进入下层以太网进行传输的,所以长度应该符合
以太协议的长度,否则要分包传递
ARP协议
我们已经知道了计算机通信的方式广播,也就是基本靠吼,在吼的过程中我们要标记目标的Mac地址,那么我们是如何获取目标计算机的mac地址的呢
arp协议功能:广播的方式发送数据包,获取目标主机的mac地址
那么协议是如何获取目标Mac地址的呢?首先我们假设我们已知双方的IP地址
(本机的ip是可以自行获取的,对方的ip是你必备的,比如你想要的访问百度,有的人会说我们并没有输入百度服务器的ip啊,家人们那些操作为了用户体验都是浏览器完成的,如果你上网需要输入一大堆数字你会崩溃的,所以ip是会与域名绑定的,具体怎么绑定我后面在介绍)
一:首先通过ip地址和子网掩码区分出自己所处的子网,当本机与目标主机处于同一子网内,那么我们将会协议得到目标计算机mac,如果是不同子网,协议会将目标mac设置为网关Mac(网关就是一个局域网的对外接口,举例来说就是局域网类似与一个个小屋子,而网关就是屋子的门与外界相连接)
二:根据目标ip找到目标子网,通过网关将数据传入,局域网内所有主机都在接受后拆开包,发现目标ip是自己然后响应,返回自己mac地址
4.传输层
解析了上面的两层之后我们发现我们可以通过ip找到目标子网,可以通过arp找到目标mac地址,那么我们就完成了找到这个世界上唯一的子网内的唯一一台主机,但是大家使用的都是应用层的东西,也就是客户端软件,那么我们如何完成对应用程序的定位呢?答案是端口,端口即应用程序与网卡关联的编号。
传输层功能:建立端口到端口的通信 补充:端口范围0-65535,0-1023为系统占用端口 ip+端口可以为我们定义一个全世界独一无二的基于网络通信的应用程序
TCP协议
可靠传输,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割。结构也是head+data
udp协议:
不可靠传输,”报头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包。
为什么会存在可靠传输和不可靠传输呢?这就要说一下tcp的工作方式了
首先tcp头中存放的是原端口和目标端口以及一系列确认号等内容,数据部分则取决于上层应用层的数据量,当上层数据量太大的时候,就无法一次行发送,因此我们需要将整个数据分割成一个个小的数据段发送,当第一段发送成功后服务器会返回收到的信息在发送下次数据。
那么数据传输就需要双向通信的管道(虚拟)
c--------------------》s
c《--------------------s
tcp的三次握手和四次挥手
第一次客户端(c)向服务器端(s)发送请求,此时客户端处于syn_sent状态,而服务器端处于listen状态在接收到客户端的请求后变成syn_rcvd状态,向客户端发送允许请求并且同时向客户端发送请求这时客户端处于established状态,客户端收到请求后返回允许,服务器端处于established状态,三次握手结束,管道建立成功。
数据传输完毕之后第一次服务端向客户端发送请求断开管道连接此时服务端处于fin_wait阶段,客户向服务端发送允许断开管道消息,此时客户端处于
close_wait阶段。同时在数据传输完毕后客户端回想服务端发送断开第二条管道的消息,此时客户端处于last_ack阶段,服务端发送允许消息,状态转为
time_wait。自此四次挥手结束,管道消失
介绍一下tcp协议的半链接池
如果同一时间有多个客户端同时要求链接服务端那么无法承受的部分去哪里呢了?那么我们将服务端比作一个房子并不能同时容下很多人,那么我们就需要一个接待室,将多余的客人放在接待室然后一个一个进入房间而当接待室也满了的时候剩余的客人就必虚排队了,这个接待室就是半链接池,半链接池内都是请求,并不是完整的信息,所以就是半了。
为什么握手三次而挥手要四次?
理论上来讲握手也需要四次,但是第二次和第三次可以进行合并,而挥手过程中第二次挥手时管道中可能还有数据,不能马上进行第三次挥手,因此有四次
在发送请求过程中发送的syn seq ack有什么作用?
建立连接的数据包,跟据syn标志位来确定是否要建立连接,seq是一串序列号,为了防止在信息传递过程中有人篡改信息,同时也是客户端用来确认服务端身份的一串密文,ack是用来确认建立连接与否的数据包同时证明身份
ps 服务端大部分时间处于listen状态等待请求,客户端大部分时间会处于established状态,管道是用来传输数据,请求是单独发送
当服务端大量处于time_wait状态时意味着服务端正在经历着高并发
那么回到上面的问题,问什么成tcp为可靠的?是因为当我们再传输过程中发现我们收到的回应显示不完整或者丢失那么tcp协议就会重新给你发送该数据包,指导我们确认了服务端已经收到信息才会在内存中删除该数据,但是珍重传输方式会拖慢我们传数据的速度,于是udp协议派上了用场,在不考虑丢包的情况下,udp协议是要优于tcp协议的。
最后在介绍一下syn洪水攻击,攻击方式为大量假ip像服务端发送tcp协议中的建立通道请求,发送完成后就消失,而服务端回应信息之后就无法收到回应,会进入短暂的等待状态(对我们来说的等待对计算机来说就像一个世纪那么久),从而导致资源被占用真正的用户请求无法第一时间被处理。
5.最后一层应用层
本层才是我们程序员(除了网络工程师)常常接触的一层,我们完成的大多数工作都是应用层应用软件的编写,通过以上几层的学习我们应该注意到,因为数据的传输要涉及到装包和解包所以我们必须规定好数据的组织格式。
应用层功能:规定应用程序的数据格式。
例:TCP协议可以为各种各样的程序传递数据,比如Email、WWW、FTP等等。那么,必须有不同协议规定电子邮件、网页、FTP数据的格式,这些应用程序协议就构成了”应用层”。
自定义协议
要注意两点 头部:对数据的描述信息 地址 类型 数据长度等 长度必须固定,因为解包过程是严格按照长度解封的
数据部分:想要发的数据
那么对于复杂的包的过程我们通常是直接调用socket套接字来帮助我们完成这一复杂过程
四 网络通信的实现
想要实现网络通信么少年?那么你需要具备四要素:本机ip 子网掩码 网关的ip dns的ip
那么先驱者为我们提供了两种方式 静态获取 动态获取
那么我们了解一下动态获取,谈到动态获取就不得不说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(domain name server 域名解析)服务器等等参数
url位于端口上方 应用层协议名 域名+端口 虚拟路径