总目录:https://blog.csdn.net/qq_41106844/article/details/105553392
网络基础 - 子目录:https://blog.csdn.net/qq_41106844/article/details/105553339
什么是C/S架构
C/S架构全称是Client/Server架构,既客户端/服务端,用来实现服务端软件与客户端软件基于网络通信.。
之后我们来看一下他们之间的通信流程:
1、客户端软件产生数据,存放于客户端软件的内存中,然后调用接口将自己内存中的数据发送/拷贝给操作系统内存
2、客户端操作系统收到数据后,按照客户端软件指定的规则(即协议)、调用网卡发送数据
3、网络传输数据
4、服务端软件调用系统接口,想要将数据从操作系统内存拷贝到自己的内存中
5、服务端操作系统收到指令后,使用与客户端相同的规则(即协议)从网卡接收到数据,然后拷贝给服务端软件
相当于小明发布了一篇博文,博文先会从APP占用的内存拷贝到手机的内存中,之后按照协议通过网络传输给服务器,服务器按照协议解读了文字,之后拷贝到服务器内。
网络的定义
在这样的传输过程中,内存之间的互相转换我们都很清楚,那么,网络传输是怎么传输的,网络又是什么。
网络的起源
20世纪50年代末,正处于冷战时期。当时美国军方为了自己的计算机网络在受到袭击时,即使部分网络被摧毁,其余部分仍能保持通信联系,便由美国国防部的高级研究计划局(ARPA)建设了一个军用网,叫做“阿帕网”(ARPAnet)。阿帕网于1969年正式启用,当时仅连接了4台计算机,供科学家们进行计算机联网实验用,这就是因特网的前身。
到70年代,ARPAnet已经有了好几十个计算机网络,但是每个网络只能在网络内部的计算机之间互联通信,不同计算机网络之间仍然不能互通。为此, ARPA又设立了新的研究项目,支持学术界和工业界进行有关的研究,研究的主要内容就是想用一种新的方法将不同的计算机局域网互联,形成“互联网”。研究人员称之为“internetwork”,简称“Internet”,这个名词就一直沿用到现在。
但是实际上那个时候,多方面纠纷下,不同的机构的网络交互模式不一样,比如第一个网络模型是IBM公司提出的SNA模型,之后还有Digital公司的DNA,美国国防部的TCP/IP,让我们记住TCP/IP,他是我们的主角。
交互模式大白话一点就是不同计算机交流的语言,SNA模型可以比喻成韩文,DNA模型可以比如成另一种语言,使用不同的模型就必须使用其公司的产品。
OSI/RM模型
为了避免纷争,国际标准化组织ISO于1977年成立了一个委员会,在现有网络的基础上,提出了不基于具体机型、操作系统或公司的网络体系结构,称为开放系统互联模型,既OSI/RM模型。
![20155953-b32802c343a76d0d.png](https://i-blog.csdnimg.cn/blog_migrate/e299f8d16ff7269b6a3814e2767987ed.png)
OSI/RM模型我们简单了解一下就可以,接下来我们主要看TCP/IP模型
TCP/IP模型
TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。
为什么国际标准化组织建立了OSI/RM模型,但是我们现在网络的主角还是TCP/IP呢。
最主要的一点还是,OSI/RM模型出现的太晚了,在当时人们已经认可了TCP/IP模型,开始大范围使用它,最开始的初衷就是为了设计一个大家都认可的网络模型,既然已经有了那就没有必要再换了。
TCP/IP模型和OSI/RM模型的对照关系:
![20155953-dac34e56a26fb9a4.png](https://i-blog.csdnimg.cn/blog_migrate/d30a5fe703d5dfa1c9f557fe82c668e4.png)
他们与协议栈的对照表:
![20155953-973a17481ec012df.png](https://i-blog.csdnimg.cn/blog_migrate/bc3792241e1a63621c2a9907101e9727.png)
硬件设备对照图:
![20155953-9fdc9ba94d73b7be.png](https://i-blog.csdnimg.cn/blog_migrate/e41124b73d6d9b3a924863eb87b1a367.png)
然后我们来说这五层:
物理层
由来:对计算机进行组网。
物理层就是负责连接各个计算机的物理设备,包括但不限于:双绞线,光缆,无线电波。
传输的信号便是01010的二进制,高压代表1,低压代表0。
数据链路层
由来:如果一直传输0101010也没有办法区分到底是什么意思,所以需要对这些位进行分组。
数据链路层负责对电信号进行分组。
他遵从的协议便是以太网协议,以太网协议的包头部分需要自身MAC地址和目标MAC地址来确认发送者和接受者,同时协议包在网络中的传输遵从IEEE802.1Q。
以太网协议ethernet:
一组电信号构成一个数据包,叫做‘帧’
每一数据帧分成:报头head和数据data两部分
head包含:(固定18个字节)
发送者/源地址,6个字节
接收者/目标地址,6个字节
数据类型,6个字节
data包含:(最短46字节,最长1500字节)
数据包的具体内容
head长度+data长度=最短64字节,最长1518字节,超过最大限制就分片发送
mac地址:
ethernet规定接入internet的设备都必须具备网卡,发送端和接收端的地址便是指网卡的地址,即mac地址
mac地址:每块网卡出厂时都被烧制上一个世界唯一的mac地址,长度为48位2进制,通常由12位16进制数表示(前六位是厂商编号,后六位是流水线号)
广播:
有了mac地址,同一网络内的两台主机就可以通信了(一台主机通过arp协议获取另外一台主机的mac地址)
ethernet采用最原始的方式,广播的方式进行通信,即计算机通信基本靠吼
![20155953-f6105ddc76c1eb23.png](https://i-blog.csdnimg.cn/blog_migrate/2c37194b933a8b5be281fc7f28a867ad.png)
网络层
由来:我们通过数据链路层知道数据包是通过广播传输出去的,那么假如我们有一个五万台计算机的网络,a要给b传消息,他要吼一嗓子让其他四万多台计算机也听到,时间长了你的网络络自己都受不了。这就需要对计算机进行划分了。
![20155953-ce4885229f964281.png](https://i-blog.csdnimg.cn/blog_migrate/c1fd63d882c295dc7d8372bbbd08f3fd.png)
必须规定一种方式用来规划计算机的广播域,同时mac地址因为他是厂商指定的,他只和厂商有关,这时IP地址就诞生了。
网络层负责管理IP地址。
ip地址有几个概念:
IP地址:
规定网络地址的协议叫ip协议,它定义的地址称之为ip地址。
广泛采用的ipv4,它规定网络地址由2的(4+1)次方个二进制表示。ipv6同理。
范围0.0.0.0-255.255.255.255
一个ip地址通常写成四段十进制数,例:127.0.0.1
子网掩码:
子网掩码是表示子网络特征的一个参数。
它在形式上等同于IP地址,也是一个32位二进制数字,它的网络部分全部为1,主机部分全部为0。
例如:IP地址172.16.10.1,如果已知网络部分是前24位,主机部分是后8位,那么子网络掩码就是11111111.11111111.11111111.00000000,写成十进制就是255.255.255.0。
子网掩码是用来标识一个IP地址的哪些位是代表网络位,以及哪些位是代表主机位。
子网掩码不能单独存在,它必须结合IP地址一起使用。子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分。
划分子网本质上就是借主机位到给网络位,每借一位主机位,这个网段的可分配主机就会越少,比如192.168.1.0/24可用主机255个,借一位变成192.168.1.0/25,那可用主机就从255-128=127个了(从最大的值开始借),再借一位192.168.1.0/26,那可用主机数就变成了255-(128+64)=63个。
IP地址分类:
IP地址是32位的二进制数值,用于在TCP/IP通讯协议中标记每台计算机的地址。通常我们使用点式十进制来表示,如192.168.0.5等等。
每个IP地址又可分为两部分。即网络号部分和主机号部分:网络号表示其所属的网络段编号,主机号则表示该网段中该主机的地址编号。按照网络规模的大小,IP地址可以分为A、B、C、D、E五类。
A类地址:以0开头,第一个字节范围:0~127(1.0.0.0 - 126.255.255.255);
B类地址:以10开头,第一个字节范围:128~191(128.0.0.0 - 191.255.255.255);
C类地址:以110开头,第一个字节范围:192~223(192.0.0.0 - 223.255.255.255);
D类地址:以1110开头,它是一个专门保留的地址。
E类地址:以11110开头,为将来使用保留。
注意:
1)以下是留用的内部私有地址,Internet上没使用的地址
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
2)IP地址与子网掩码相与得到网络号
3)主机号,全为0的是网络号(例如:192.168.2.0),主机号全为1的为广播地址(192.168.2.255)
4)环回地址:127.0.0.1
网络层有四个协议:IP协议,ARP协议,ICMP协议,IGMP协议
IP协议(网际协议):
IP协议是TCP/IP协议的核心,所有的TCP,UDP,IMCP,IGCP的数据都以IP数据格式传输。
![20155953-881484eacf9bb780.png](https://i-blog.csdnimg.cn/blog_migrate/f4fef89b4e2f4d6f54ff339f3e5dd8ff.png)
ARP协议(地址解析协议):
通信是基于mac的广播方式实现,计算机在发包时,获取自身的mac是容易的,如何获取目标主机的mac,就需要通过arp协议。
工作流程
1:首先,每个主机都会在自己的ARP缓冲区中建立一个ARP列表,以表示IP地址和MAC地址之间的对应关系。
2:当源主机要发送数据时,首先检查ARP列表中是否有对应IP地址的目的主机的MAC地址,如果有,则直接发送数据,如果没有,就向本网段的所有主机发送ARP数据包,该数据包包括的内容有:源主机 IP地址,源主机MAC地址,目的主机的IP 地址
3:当本网络的所有主机收到该ARP数据包时,首先检查数据包中的IP地址是否是自己的IP地址,如果不是,则忽略该数据包,如果是,则首先从数据包中取出源主机的IP和MAC地址写入到ARP列表中,如果已经存在,则覆盖,然后将自己的MAC地址写入ARP响应包中,告诉源主机自己是它想要找的MAC地址。
4:源主机收到ARP响应包后。将目的主机的IP和MAC地址写入ARP列表,并利用此信息发送数据。如果源主机一直没有收到ARP响应数据包,表示ARP查询失败。
ICMP协议(因特网控制报文协议):
它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。
当传送IP数据包发生错误--比如主机不可达,路由不可达等等,ICMP协议将会把错误信息封包,然后传送回给主机。给主机一个处理错误的机会.
我们一般主要用ICMP协议检测网络是否通畅,基于ICMP协议的工具主要有ping 和traceroute。
传输层
由来:我们已经知道怎么传数据包,怎么找到对方,但是我们每发一个包就要找一次对方吗,这样会让数据包的传输延迟太大,所以能不能有保持传输的功能,这就是传输层负责的东西。
说道传输层就离不开传输层的两大协议:TCP协议和UDP协议。
TCP协议(传输控制协议):
再说TCP协议前,先说说报文和TCP的握手。
![20155953-df7d839889633d8e.png](https://i-blog.csdnimg.cn/blog_migrate/81cf120469d16b05e77de4924b291aa5.png)
![20155953-0cc9482d2b9a06bf.png](https://i-blog.csdnimg.cn/blog_migrate/40a64f1b5b896f10e5a0617870c054ee.png)
三次握手:
客户端发送syn包(seq=x)到服务器,并进入SYN_SEND(发送)状态,等待服务器确认;
服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(seq=y),即SYN+ACK包,此时服务器进入SYN_RECV(接收)状态;
客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(已建立)状态,完成三次握手。
四次握手:
主动关闭方发送一个FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不 会再给你发数据了(当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,主动关闭方依然会重发这些数据),但是,此时主动关闭方还可 以接受数据。
被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1。
被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。
主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。
对应的协议:
(1)FTP:定义了文件传输协议,使用21端口。
(2)Telnet:一种用于远程登陆的端口,使用23端口,用户可以以自己的身份远程连接到计算机上,可提供基于DOS模式下的通信服务。
(3)SMTP:邮件传送协议,用于发送邮件。服务器开放的是25号端口。
(4)POP3:它是和SMTP对应,POP3用于接收邮件。POP3协议所用的是110端口。
(5)HTTP:是从Web服务器传输超文本到本地浏览器的传送协议。
UDP协议(用户数据包协议):
和TCP不同,UDP不需要麻烦而又严格的校验,握手操作,他很直接,我找到你了,那我就开始把我要传给你的都一股脑传过去。没有维护,不需要校验,安全性差但是节省资源。
对应的协议:
(1)DNS:用于域名解析服务,将域名地址转换为IP地址。DNS用的是53号端口。
(2)SNMP:简单网络管理协议,使用161号端口,是用来管理网络设备的。由于网络设备很多,无连接的服务就体现出其优势。
(3) TFTP(Trival File Transfer Protocal),简单文件传输协议,该协议在熟知端口69上使用UDP服务。
应用层
直接和用户交互的层次,我们看到的界面,在传输是有一个编码和指定回话的过程。可以理解成打包+信戳的过程。
什么是socket
socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
![20155953-c84c6ad607aad1d0.png](https://i-blog.csdnimg.cn/blog_migrate/89144106a7c7adc69ee22c7e650cfbf9.png)
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
socket在某种意义上为我们封装好了tcp/udp,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。
![20155953-27738f27e915fff5.png](https://i-blog.csdnimg.cn/blog_migrate/a0173856031241c1105a64fa24da66ce.png)
先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。
在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。
客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。