网络编程前戏和OSI七层协议
一、软件开发架构
1.什么是软件开发架构
- 编写项目之前需要遵循的代码层面上的规范(代码运行的流程 环节 步骤)
- eg:回想ATM三层架构 选课系统三层架构
2.软件开发架构
架构方式一:c/s架构
c:client 客户端
s:server 服务端
计算机上下载的各个互联网公司的app软件,本质其实是客户端。
而我们下载一个个不同的客户端就是为了体验不同服务端提供的服务。
eg:
下载淘宝就是为了体验淘宝服务端提供的购物服务
下载抖音就是为了体验抖音服务端提供的视频服务
ps:一般情况下客户端与服务端交互需要互联网 但是有些不需要(因为客户端和服务端都在一台计算机上,比如我们玩的一些单机游戏)
类比:
客户端可以看成是即将去消费的客人
服务端可以看成是给你提供服务的店
作为服务端必备的多个条件
1.24小时不间断提供服务
2.固定的地址
3.能够服务多个客人(高并发)
架构方式二:b/s架构
b:broswer 浏览器
s:server 服务器
b/s架构本质也是c/s架构
通过浏览器来充当各个服务端的客户端,想要体验服务时不需要下载指定的客户端
架构优劣势
cs架构
- 优势:不同公司的客户端由不同公司独立开发,可以高度定制化客户端功能
- 劣势:使用必须先下载客户端,比较繁琐
bs架构
- 优势:不需要下载客户端,能够快速体验服务
- 劣势:无法高度定制化,并且需要遵守很多规则
架构发展趋势
二、架构总结
再次申明: 上述架构与我们之前所学的三层架构其实一样
当我们实际使用的时候跟面向对象和面向过程一样。c/s和b/s是交替使用,互相穿插的
发展趋势:统一接口原则
微信
- 当我们使用微信的时候需要下载微信客户端,但是在微信中有很多的小程序,可以让我们体验其他软件(客户端)才有的服务和功能,这些小程序的编写的时候采用的就是统一接口,这样都可以加入到微信的小程序中供人使用。
支付宝
里面同样也有很多的小程序,可以使用其他功能
后续就是cs和bs交错使用 避免各自的劣势!!!
ps:可以方便用户使用 更重要的是可以给自己圈用户便于后期收割
三、网络编程前戏
1.什么是网络编程
- 基于网络编写代码 能够实现数据的远程交互
2.学习网络编程的目的
能够开发cs架构的软件
3.网络编程的起源
任何先进的技术一般都来源于军事,淘汰后才进去民用领域
网络编程是由美国军方开发的,没有网络编程的时候,如果两台计算机之间要交互数据,只能使用硬盘拷贝。如果一个人在中国一个人在非洲,那就拿着硬盘坐飞机去拷贝数据。
4.网络编程的要求
数据的远程交互
1.早期的电话
必须要有电话线
2.大屁股电脑
必须要有网线
3.笔记本电脑
必须要有网卡
通过上面的例子我们得知计算机之间要想实现远程数据交互,首要条件就是要有物理连接介质
四、OSI七层协议简介
OSI七层协议:规定了所有的计算机在远程数据交互的时候必须经过相同的处理流程、在制造过程中必须拥有相同的功能硬件
具体名称如下:
应用层
表示层
会话层
传输层
网络层
数据链路层
物理连接层
ps:应、表、会、传、网、数、物(记忆方法)
'''通过整合之后可以变成五层或者四层'''
五层:
应用层(应用层、表示层、会话层整合在一起)
传输层
网络层
数据链路层
物理连接层
四层:
应用层
传输层
网络层
网络接口层(数据链路层、物理连接层)
ps:
接收网络消息 数据由下往上传递
发送网络消息 数据由上往下传递
五、OSI协议之物理连接层
在网络变成前戏中我们提到了数据的远程交互必须要有物理介质,在OSI七层协议中就指的是物理连接层,同时我们也要知道数据在传输的时候全是二进制、bytes类型。
六、OSI七层协议之数据链路层
作用:
1.规定了电信号的分组方式
2.规定了每台计算机都必须有一块网卡
同时网卡上必须有一串记录>>>:电脑的以太网地址(身份证号) 也叫mac地址
以太网地址\mac地址:由12位16进制数组成的
前6位:产商编号
后6位:生产流水线号
ps:既然mac地址相当于电脑的身份证号 也就意味着可以根据该地址查找计算机(可以基于mac地址实现数据交互)
七、网络相关专业名词
计算机之间要想实现数据交互必须要'连接'到一起
1.交换机
在最早的时候,直接使用网线连接,进行数据交互
当服务器多了之后导致了连接变得麻烦,因此有了交换机
- 能够将所有接入交换机的计算机彼此互联起来
2.广播
原理
有了交换机之后,根据电脑的mac地址就可以实现数据交互
广播:
先在交换机中吼,所有接入交换机的设备都能收到
单播:
只有被查找设备 才会回复相应信息
也就是向当前交换机连接的所有服务器发送请求,然后只有被查找的对象才会对查找对象进行单独的回应(也可以看成在群聊里找人,被找的人通过私聊联系查找的人),这里需要注意,只有第一次查找的时候需要广播,后面就可以根据mac地址直接访问对方
缺陷
1.mac地址通信仅限于局域网
2.接入交换机的设备过多 可能会造成广播风暴
广播风暴:类似于所有人同时吼!!!
3.单播
首次被查找的计算机回应查找它的计算机 并附带自己的mac地址
4.广播风暴
接入同一台交换机的多台计算机同时发广播,广播数据充斥网络无法处理,并占用大量网络带宽,导致正常业务不能运行,甚至彻底瘫痪,这就发生了“广播风暴”。
5.局域网
局域网的覆盖范围一般是方圆几千米之内,其具备的安装便捷、成本节约、扩展方便等特点。
可以简单的理解为由单个交换机组成的网络(交换机也分大型和小型)
在局域网内可以直接使用mac地址通信
6.广域网
广域网又称广域网、外网、公网。是连接不同地区局域网或城域网计算机通信的远程网。通常跨接很大的物理范围,所覆盖的范围从几十公里到几千公里,它能连接多个地区、城市和国家,或横跨几个洲并能提供远距离通信,形成国际性的远程网络。广域网并不等同于互联网。可以简单的理解为范围更大的局域网
ps:所谓的广域网跟局域网其实是相对的,比如中国是一个很大的局域网,这时候因为中国这个局域网很大,我们也可以说他是广域网
7.互联网
由所有的局域网、广域网连接到一起形成的网络
8.路由器
不同的局域网计算机之间是无法直接实现数据交互的 需要路由器连接
八、OSI七层协议之网络层
IP协议:规定了所有接入互联网的计算机都必须有一个IP地址 类似于身份证号
mac地址是物理地址可以看成永远无法修改
IP地址是动态分配的,不同的场所IP是不同的
IPV4(32位二进制)编址方式:点分十进制法(0、1组成)
IPV6(128位二进制)编址方式:冒分十六进制法
完整IP地址:IP地址+子网掩码
IP地址:网络位+主机位
地址分类:(转二进制看位数 )
A类地址:第一位固定为0
0XXX XXXX---0-127(1-126),子网掩码默认为255.0.0.0
B类地址:第一位固定为10
10XX XXXX---128-191,子网掩码默认为255.255.0.0
C类地址:第一位固定为110
110X XXXX---192-223,子网掩码默认为255.255.255.0
D类地址:第一位固定为1110
1110 XXXX---224-239,子网掩码默认为255.255.255.255
E类地址:第一位固定为1111
1111 XXXX---240-255,科研地址
特殊地址:
1、0.X.X.X 无效地址(保留地址),0.0.0.0无效地址,用于占位
2、127.0.0.1 回路地址,用于本地测试
3、网络号,主机位全为0,用于描述一个网段
4、255.255.255.255为受限广播地址
5、主机位全为1,定向广播地址
6、本地链路地址:link-local (169.254.0.0 255.255.00)
公有地址:具有全球唯一性标识地址
私有地址:不具唯一标识地址
10.0.0.0 255.255.0.0
172.[16,31].0.0 255.255.0.0
192.168.X(0,255).0 255.255.0.0
ps:IP地址可以跨局域网传输,因此IP地址可以用来标识全世界独一无二的一台计算机
九、OSI七层协议之传输层
PORT协议(端口协议)
端口的作用:用来标识一台计算机上面的某一个应用程序
范围:0-65535
特征:动态分配(洗浴中心号码牌)
也就是说你需要用到的时候,我就临时给你分配,使用结束就回收这个端口号。
建议:
0-1024 系统默认需要使用
1024-8000 常见软件的端口号
8000之后的 通常我们使用的都是8000之后的
常见端口号(<256):
21端口号:FTP 文件传输服务
22端口号:SSH 远程登录(安全性较高 加密认证)- TCP
23端口:Telnet 远程登录服务 TCP
25端口:SMTP 简单邮件传输服务
53端口:DNS 域名解析服务 TCP和UDP
80端口:HTTP 超文本传输协议 TCP
110端口:POP3 “邮局协议版本”使用的端口
443端口:HTTPS 加密的超文本传输协议 TCP
520端口:RIP UDP
URL:统一资源定位符(网址)
网址本质是有IP和PORT组成的!!!
IP+PORT:能够定位全世界独一无二的一台计算机上面的某一个应用程序
DNS域名解析:
将网址解析成IP+PORT(域名,也就是网址,是由IP+端口号组成的)
我们之所以不直接使用IP+PORT的原因是太难记 所以发明了域名(网址)
www.baidu.com # 好记
14.215.177.39:80 # 难记
IP:PORT 实际使用冒号连接
114.55.205.139:80
十、传输层之TCP与UDP协议
TCP与UDP协议都是用来规定通信方式的。比如我们在聊天的时候可以随心所欲的聊,有些时候又需要遵循一些规律进行聊天。
当我们跟关系很好的朋友聊天的时候,百无禁忌,上到国家,下到生活中的琐事都可以聊。这就相当于没有设立规定时的通信。
当我们在上课的时候,只能跟老师和同学沟通学习相关的问题。在写作文的时候需要开头空两格,需要分段。写信时需要用上书信格式。这些都相当于设立了规定后的通信。
ps:不遵循上述协议也可以通信 只不过遵循了更合规合法合理!!!
1.TCP协议(重要)
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议。
当应用程序希望通过 TCP 与另一个应用程序通信时,它会发送一个通信请求。这个请求必须被送到一个确切的地址。在双方“握手”之后,TCP 将在两个应用程序之间建立一个全双工 (full-duplex) 的通信。
这个全双工的通信将占用两个计算机之间的通信线路,直到它被一方或双方关闭为止。
三次握手建链接(白话版)
1.三次握手建立连接的过程(白话版)
第一次握手:客户端这边向服务端发送建立连接的请求(SYN seq = x)
第二次握手:服务端接收请求并回应,回应的同时向客户端发送建立连接的请求(这里可以看成同时进行了两步,如果服务端同意建立连接,这时候就会建立起客户端发送数据到服务端的数据传输通道,之后的服务端向客户端发送建立连接的请求是为了建立服务端返回数据到客户端的数据传输通道。SYN seq = y,ACK = x + 1)
第三次握手:客户端向服务端进行回应(ACK = y + 1)这时就建立起了两者的双向数据传输通道
2.TCP协议也称为可靠协议(数据不容易丢失)
造成数据不容易丢失的原因不是因为有双向通道 而是因为有反馈机制
给对方发消息之后会保留一个副本 直到对方回应消息收到了才会删除
否则会在一定的时间内反复发送。
3.洪水攻击
同一时间有大量的客户端请求建立链接就会导致服务端一直处于SYN_RCVD状态
4.服务端如何区分客户端建立链接的请求
当我们在建立连接的时候,客户端会发送上图中的请求seq,这个seq带有一串数字,类似识别号码,服务端端受到请求进行反馈的时候返回的信息就是上图中的ACK,ACK会把seq中的识别号码+1然后返回回来,因为不同的客户端发送seq的时候有不同的识别号码,服务端靠这种方式来区分请求(对请求做唯一标识)。
三次握手专业版
刚开始客户端处于 Closed 的状态,服务端处于 Listen 状态。
进行三次握手:
第一次握手:客户端给服务端发一个 SYN 报文,并指明客户端的初始化序列号 ISN。此时客户端处于
SYN_SENT
状态。首部的同步位SYN=1,初始序号seq=x,SYN=1的报文段不能携带数据,但要消耗掉一个序号。
第二次握手:服务器收到客户端的 SYN 报文之后,会以自己的 SYN 报文作为应答,并且也是指定了自己的初始化序列号 ISN(s)。同时会把客户端的 ISN + 1 作为ACK 的值,表示自己已经收到了客户端的 SYN,此时服务器处于
SYN_RCVD
的状态。在确认报文段中SYN=1,ACK=1(确认值(Acknowledgement),为1便是确认连接,为0就是不在连接状态),确认号ack=x+1(确认编号(Acknowledgement Number),即接收到的上一次远端主机传来的seq然后+1,再发送给远端主机),初始序号seq=y。
第三次握手:客户端收到 SYN 报文之后,会发送一个 ACK 报文,当然,也是一样把服务器的 ISN + 1 作为 ACK 的值,表示已经收到了服务端的 SYN 报文,此时客户端处于
ESTABLISHED
状态。服务器收到 ACK 报文之后,也处于ESTABLISHED
状态,此时,双方已建立起了连接。确认报文段ACK=1,确认号ack=y+1,序号seq=x+1(初始为seq=x,第二个报文段所以要+1),ACK报文段可以携带数据,不携带数据则不消耗序号。
发送第一个SYN的一端将执行主动打开(active open),接收这个SYN并发回下一个SYN的另一端执行被动打开(passive open)。
在socket编程中,客户端执行connect()时,将触发三次握手。
四次挥手断连接(白话版)
1.四次挥手断开连接的过程(白话版)
第一次挥手:当客户端没有信息需要发送给服务端的时候,客户端会发送断开连接的请求(SYN seq = x+2)
第二次挥手:这时服务端会回应客户端,确认断开客户端传输信息给服务端的数据传输通道(ACK=x+3)
TIME_WAIT状态:当断开客户端传输数据到服务端的数据传输通道后,服务端需要先确认是否还有消息需要发送给客户端,发送完毕、确认无误后才会继续后续操作断开连接
第三次挥手:服务端向客户端发送断开通道连接的请求(seq = y + 1)
第四次挥手:客户端向服务端发送回应然后断开服务端跟客户端进行数据传输的通道(ACK = y + 2)
2.四次不能合并为三次
因为中间需要确认消息是否发完(TIME_WAIT)
三次握手和四次挥手也可以看成是小情侣谈恋爱的过程:
三次握手:表白在一起
四次挥手:决裂要分手
四次挥手专业版
建立一个连接需要三次握手,而终止一个连接要经过四次挥手(也有将四次挥手叫做四次握手的)。这由TCP的半关闭(half-close)造成的。所谓的半关闭,其实就是TCP提供了连接的一端在结束它的发送端还能接收来自另一端数据的能力。
TCP 连接的拆除需要发送四个包,因此称为四次挥手(Four-way handshake),客户端或服务端均可主动发起挥手动作。
刚开始双方都处于ESTABLISHED
状态,假如是客户端先发起关闭请求。四次挥手的过程如下:
- 第一次挥手:客户端发送一个 FIN 报文,报文中会指定一个序列号。此时客户端处于
FIN_WAIT1
状态。
即发出连接释放报文段(FIN=1,序列号seq=u),并停止再发送数据,主动关闭TCP连接,进入FIN_WAIT1(终止等待1)状态,等待服务端的确认。 - 第二次挥手:服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序列号值 +1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了,此时服务端处于
CLOSE_WAIT
状态。
即服务端收到连接释放报文段后即发出确认报文段(ACK=1,确认号ack=u+1,序号seq=v),服务端进入CLOSE_WAIT(关闭等待)状态,此时的TCP处于半关闭状态,客户端到服务端的连接释放。客户端收到服务端的确认后,进入FIN_WAIT2(终止等待2)状态,等待服务端发出的连接释放报文段。 - 第三次挥手:如果服务端也想断开连接了,和客户端的第一次挥手一样,发给 FIN 报文,且指定一个序列号。此时服务端处于
LAST_ACK
的状态。
即服务端没有要向客户端发出的数据,服务端发出连接释放报文段(FIN=1,ACK=1,序号seq=w,确认号ack=u+1),服务端进入LAST_ACK(最后确认)状态,等待客户端的确认。 - 第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答,且把服务端的序列号值 +1 作为自己 ACK 报文的序列号值,此时客户端处于
TIME_WAIT
状态。需要过一阵子以确保服务端收到自己的 ACK 报文之后才会进入 CLOSED 状态,服务端收到 ACK 报文之后,就关闭连接了,处于CLOSED
状态。
即客户端收到服务端的连接释放报文段后,对此发出确认报文段(ACK=1,seq=u+1,ack=w+1),客户端进入TIME_WAIT(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL后,客户端才进入CLOSED状态。
收到一个FIN只意味着在这一方向上没有数据流动。客户端执行主动关闭并进入TIME_WAIT是正常的,服务端通常执行被动关闭,不会进入TIME_WAIT状态。
在socket编程中,任何一方执行close()操作即可产生挥手操作。
2.UDP协议
UDP(User Datagram Protocol)不可靠的、无连接的服务,传输效率高(发送前时延小),一对一、一对多、多对一、多对多、面向报文,尽最大努力服务,无拥塞控制。使用UDP的应用:域名系统 (DNS);视频流;IP语音(VoIP)。
早期的QQ使用的是纯生的(没有加任何额外功能)UDP协议,导致很容易出现数据丢失,接收不到。现在的QQ自己添加了很多技术和功能。
使用UDP的原因就是因为很简单:快捷、粗暴,只要指定对方的地址就可以发消息了
3.tcp和udp的对比
上面的TCP协议相当于打电话一样,双方有来有回
UDP协议就相当于发短信,信息发出去了,但是不一定有回应,因此也称之为数据报协议、不可靠协议
TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。
UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快
十一、应用层简介
应用层相当于是程序员自己写的应用程序 里面的协议非常的多
常见的有:HTTP、HTTPS、FTP
ps:后续框架部分再做介绍
网络编程前戏和OSI七层协议的更多相关文章
- 网络编程简介(OSI七层协议,TCP协议原理,三次握手与四次挥手)
目录 网络编程 软件开发架构 C/S架构 B/S架构 网络编程的发展史 互联网协议 1.物理连接层 2.数据链路层 3.网络层 4.传输层 5.应用层 三次握手四次挥手 三次握手建链接 数据传输 四次 ...
- 软件开发架构,网络编程简介,OSI七层协议,TCP和UDP协议
软件开发架构 什么是软件开发架构 1.软件架构是一个系统的草图. 2.软件架构描述的对象是直接构成系统的抽象组件. 3.各个组件之间的连接则明确和相对细致地描述组件之间的通讯. 4.在实现阶段,这些抽 ...
- 网络编程---scoket使用,七层协议,三次挥手建连接,四次挥手断连接
目录 == 网络编程 == 软件开发架构 网络编程 互联网协议 TCP协议的工作原理 Socket == 网络编程 == 软件开发架构 开发软件 必须要开发一套 客户端与服务端 客户端与服务端的作用 ...
- 网络编程概念 和OSI七层结构简介
什么是网络编程 网络通常指的是计算机中的互联网,是由多台计算机通过网线或其他媒介相互链接组成的 编写基于网络的应用程序的过程序称之为网络编程 学习网络编程就是要学习利用网络来与另一台计算机相互传输数据 ...
- 网络编程、OSI七层协议
目录 软件开发架构 1.什么是软件开发架构 2.软件开发架构 3.架构优劣势 4.架构发展趋势 网络编程简介 1.如何理解网络编程 2.网络编程的目的 3.网络编程的意义 4.网络编程的起源 5.网络 ...
- 01网络编程(基础知识+OSI七层协议+TCP与UDP)
目录 01 网络编程 一.软件开发架构 1.1 CS架构 1.2 BS架构 二.网络理论前戏 2.1 简介 2.2 常见硬件 三.OSI七层协议(五层) 3.1 七层协议 3.2 五层协议 3.3 知 ...
- 1、网络并发编程--简介、软件开发架构、OSI七层协议
python复习 变量与常量 基本数据类型 内置方法 字符编码.文件操作 函数 函数参数.闭包函数.装饰器 面向对象 封装.继承.多态 """ 什么是对象 数据与功能的结 ...
- Day09: socket网络编程-OSI七层协议,tcp/udp套接字,tcp粘包问题,socketserver
今日内容:socket网络编程 1.OSI七层协议 2.基于tcp协议的套接字通信 3.模拟ssh远程执行命令 4.tcp的粘包问题及解决方案 5.基于udp协议的套接字 ...
- 8.6 day27 网络编程 osi七层协议 Time模块补充知识 TCP协议
Time模块补充知识 date和datetime区别是什么? date 就是年月日 datetime就是年月时时分秒 以下代码为什么会报错? import json from datetime imp ...
- python网络编程-Json序列化功能扩展-软件开发架构-OSI七层协议-TCP-01
面向对象补充知识点(面向对象的应用) 扩展json序列化所支持的数据类型(分析源码) import json from datetime import datetime, date # ------- ...
随机推荐
- SpringCloud(十) - Docker
1.Docker安装 1.1 卸载旧版本(否者会安装出错) sudo yum remove docker \ docker-client \ docker-client-latest \ docker ...
- Java环境搭建(推荐jdk8)
本人使用的Windows10操作系统 1.Jdk8下载和安装 下载地址:https://www.oracle.com/cn/java/technologies/javase/javase-jdk8-d ...
- 聊聊消息队列(MQ)那些事
每年的双十一期间,各大电商平台流量暴增,同时,电商平台系统的负载压力也会很大.譬如订单支付的场景,每个订单支付成功后,服务器可能要完成扣减积分.扣减优惠券.扣减商品库存.发短信等一系列操作.单个用户请 ...
- 1742C
题目链接 题目大意: 在一个8x8的方格中你每次可以将一行全部涂成红色或者将一列涂成蓝色.问最后一次操作是什么操作: 如果是行操作就输出R 如果是列操作就输出B 解题思路: 我们可一枚举每行每列,如果 ...
- day02 数据类型 & 运算符
day02 数据类型 基本数据类型 共有四类八种 1)整数类型 byte short int long byte: 字节 bit比特,1bit = 1二进制位 ,byte占8位 [-128,128 ...
- Day29 Linux相关命令的使用
今日内容 基本概念 安装 基本命令 在linux上安装软件 jdk mysql jdk Nginx的安装 一.概述 1.Unix linux基于Unix,Unix由贝尔实验室在1969年开发 一开始由 ...
- NCTF2022 - pwn 部分 wp
总的来说我出的几题不是很难,主要是想把自己感觉有意思的一些东西分享给大家. ezlogin 程序设计周大作业稍加改编出的题目.洞在Tea里,有个数组越界写,为了避开\x00截断,我给了*可以对其进行替 ...
- JavaFX入门笔记
JavaFX入门笔记 背景 Java选修课第四次实验 所需工具 IDEA JavaFX插件(需要Maven) JavaFX Scene Builder 参考资料 https://www.yiibai. ...
- QT+VS 调用基于Google Breakpad的跨平台Qt崩溃异常捕获调用方案
方案一.基于Google Breakpad的跨平台Qt崩溃异常捕获调用方案 首先上博客:Windows下Qt生成dump文件并定位bug(基于qBreakpad) 这个地方使用的是一个叫qBreakP ...
- cmd命令行ssh连接Linux服务器
打开cmd工具 使用命令ssh连接服务器 ssh 用户名@ip地址 (不需要指定端口号,默认端口就是22) 输入密码即可