网络编程1

研究网络编程其实就是在研究计算机的底层原理及发展史

一.楔子

你现在已经学会了写python代码,假如你写了两个python文件a.py和b.py,分别去运行,你就会发现,这两个python的文件分别运行的很好。但是如果这两个程序之间想要传递一个数据,你要怎么做呢?

这个问题以你现在的知识就可以解决了,我们可以创建一个文件,把a.py想要传递的内容写到文件中,然后b.py从这个文件中读取内容就可以了。

但是当你的a.py和b.py分别在不同电脑上的时候,你要怎么办呢?

类似的机制有计算机网盘,qq等等。我们可以在我们的电脑上和别人聊天,可以在自己的电脑上向网盘中上传、下载内容。这些都是两个程序在通信。

二.软件开发的架构

我们了解的涉及到两个程序之间通讯的应用大致可以分为两种:

第一种是应用类:qq、微信、网盘、优酷这一类是属于需要安装的桌面应用

第二种是web类:比如百度、知乎、博客园等使用浏览器访问就可以直接使用的应用

这些应用的本质其实都是两个程序之间的通讯。而这两个分类又对应了两个软件开发的架构~

1.C/S架构

client(客户端)---------------------网络---------------------->server(服务端)

一般情况下客户端与服务端交互需要互联网 但是有些不需要(因为客户端和服务端都在一台计算机上)

c:client:客户端(用户),客户端可以有多个!!!
s:server:服务端(饭店中的工作人员),针对于一款软件来说,服务端就有一个

2.B/S架构

browser(浏览器)---------------------网络---------------------->server(服务器/端)

b:browser:浏览器 ------> 浏览器本身也是客户端(万能的客户端)
s:server:服务端(饭店中的工作人员)
本质上B/S架构也是C/S架构!!!

3.面试题

数据放在服务端和客户端的利与弊?
● 服务端统一处理有更好的安全性和稳定性而且升级比较容易,不过服务器负担就增加了。
● 客户端将负担分配到每个用户,从而可以节约服务器资源,安全性和稳定性可能会有一定的问题,但是升级比较麻烦,每个安装的客户端程序都需要升级,另外为了节省网络资源,通过网络传输的数据应该尽量减少!

1.客户端到浏览器的演变
客户端中存在的问题:用户向使用软件就必须下载客户端使用,当用户下载的客户端足够多的时候,电脑就有可能会受到影响,在有就是客户要不断的下载,很不方便
浏览器的诞生:由于客户端存在的问题,随着互联网的兴起,就有人站出来开发出一款浏览器,其实,浏览器就是一个万能客户端, 或者叫超级客户端

2.服务端所具备的特征:

  • 24小时不间断对外提供服务
  • 服务端要有个公网IP,即固定的地址
  • 能够服务多个客人(高并发)
'''
C/S架构
	优势:不同公司的客户端由不同公司独立开发,可以高度定制化客户端功能
	劣势:需要下载才能使用
B/S架构
	优势:不用下载直接访问
	劣势:无法高度定制化,并且需要遵守很多规则
'''

三.网络基础

基础知识
我们开发的软件都是基于网络传输的,我们现在搞清楚的是网络知识

  1. 什么是网络?
  • 网络又称之为信息高速公路
  • 上网的本质:上传和下载数据的过程!!!
  • 最开始的时候,网络是一个个的局域网,世界上的其他电脑不能通信的,后来,把世界上其他电脑互通起来,这就是现在的互联网
  • 网络的组成部分:物理链接设备(硬件)(网线,交换机,路由器等)+互联网通信协议(计算机的规则)
  • 连接两台计算机之间的 Internet 实际上就是一系列统一的标准,这些标准称之为互联网协议,互联网的本质就是一系列的协议,总称为“互联网协议”(Internet Protocol Suite)。

  1. 网络有什么好处
    方便数据传输

  2. 什么是网络编程
    基于网络编写代码,能够实现数据的远程交互
    实现数据的远程交互必备的基础条件是物理连接介质

  3. 学习网络编程的目的
    能够开发cs架构的软件

四.OSI七层协议

互联网的本质就是一系列的网络协议,这个协议就叫OSI协议(一系列协议),按照功能不同,分工不同,人为的分层七层。实际上这个七层是不存在的。没有这七层的概念,只是人为的划分而已。区分出来的目的只是让你明白哪一层是干什么用的。

  • 每一层都运行不同的协议。协议是干什么的,协议就是标准。
    实际上还有人把它划成五层、四层。
    七层划分为:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。(记忆:应、表、会、传、网、数、物)
    五层划分为:应用层、传输层、网络层、数据链路层、物理层。
    四层划分为:应用层、传输层、网络层、网络接口层。


首先,用户感知到的只是最上面一层应用层,自上而下每层都依赖于下一层,所以我们从最下一层开始切入,比较好理解

每层都运行特定的协议,越往上越靠近用户,越往下越靠近硬件

接收网络消息 数据由下往上传递
发送网络消息 数据由上往下传递

  • 每层运行常见的物理设备

1.物理连接层

物理层功能:主要用于确保计算机之间的物理连接介质,接收数据(bytes类型、二进制数据)

基于电器特性负责发送高低电频,高电压对应数字1,低电压对应数字0 :(11)1010111010101010101

单纯的发送高低电频是没有意义的,需要进行分组,来表示不同的意思。分组是谁干的活呢?物理层干不了,这个是数据链路层干的。

2.数据链路层

数据链路层的功能:定义了电信号的分组方式

以太网协议ethernet

  • 规定了计算机在出厂的时候都必须有一块网卡,网卡上有一串数字。该数字相当于是计算机的身份证号码是独一无二的
  • 该数字的特征:12位16进制数据。前6位产商编号,后6位流水线号
  • 该数字也称为:以太网地址/MAC地址

数据帧

ethernet规定:一组电信号构成一个数据报,叫做’帧’,每一数据帧分成:报头head和数据data两部分
● head包含:(固定18个字节)
○ 发送者/源地址,6个字节
○ 接收者/目标地址,6个字节
○ 数据类型,6个字节
● data包含:(最短46字节,最长1500字节)

● 数据报的具体内容:head长度+data长度=最短64字节,最长1518字节,超过最大限制就分片发送

Mac地址
head中包含的源和目标地址由来:ethernet规定接入internet的设备都必须具备网卡,发送端和接收端的地址便是指网卡的地址,即Mac地址
Mac地址:每块网卡出厂时都被烧制上一个世界唯一的Mac地址,长度为48位2进制,通常由12位16进制数表示(前六位是厂商编号,后六位是流水线号)

3.网络层

3.1 IP协议

规定了所有接入互联网的计算机都必须有一个IP地址,类似于身份证号
mac地址是'物理地址'可以看成永远无法修改
IP地址是动态分配的,不同的场所IP是不同的

  • IP地址特征
    • IPV4:点分十进制,0.0.0.0 --------->255.255.255.255
    • IPV6:点分十六进制
  • 如何查看自己电脑的IP地址
    cmd---->ipconfig(Windows系统),ifconfig(Mac系统或者Linux系统)
  • 网络的划分:广域网,局域网
    其实一个IP地址可以定位一个局域网,一个mac地址(物理地址)定位局域网中得一台计算机。ip+mac地址可以定位一个局域网中得唯一一台计算机。
    其实,其实根本不需要mac地址,只需要一个IP地址就能确定,为什么呢?
    是因为有一个arp协议,专门负责把IP地址解析成mac地址,也就说有了IP地址,就有了mac地址。
    所以,一个IP可以定位到世界范围内独一无二的一台计算机

3.2 数据包(packet)

4.传输层

传输层的由来:网络层的IP帮我们区分子网,以太网层的Mac帮我们找到主机,然后大家使用的都是应用程序,你的电脑上可能同时开启qq,暴风影音,等多个应用程序。
那么我们通过IP和Mac找到了一台特定的主机,如何标识这台主机上的应用程序,答案就是端口,端口即应用程序与网卡关联的编号。
传输层功能:建立端口到端口的通信
一台电脑上的端口分配有:0-1024之间的端口默认是系统使用的,我们不要使用,如果使用,就有可能端口冲突。1024-8000之间的端口,一般是常用软件的端口。以后我们自己开发的软件,端口最后使用8000之后的。
ip+port:定位世界范围内独一无二的一台计算机正在运行的一个应用程序

4.1 常用的熟知端口号

应用程序 FTP TFTP TELNET SMTP DNS HTTP SSH MYSQL Django
熟知端口 21,20 69 23 25 53 80 22 3306 8000
传输层协议 TCP UDP TCP TCP UDP TCP TCP TCP

4.2 TCP协议

TCP与UDP都是用来规定数据交互方式的

TCP协议也称为是可靠协议。为什么说可靠呢?(数据不容易丢失):TCP协议数据传输的时候,建立双向管道,造成数据不容易丢失的原因不是因为有双向通道,而是因为有'反馈机制',给对方发消息之后会保留一个副本,直到对方回应消息收到了才会删除,否则会在一定的时间内反复发送。

基于以上,我们也称TCP协议为流式协议,像流水一样

TCP协议的三次握手与四次挥手

TCP协议的三次握手

● 最开始的时候客户端和服务器都是处于CLOSED状态。主动打开连接的为客户端,被动打开连接的是服务器。

  1. TCP服务器进程先创建传输控制块TCB,时刻准备接受客户进程的连接请求,此时服务器就进入了LISTEN(监听)状态;
  2. TCP客户进程也是先创建传输控制块TCB,然后向服务器发出连接请求报文,这是报文首部中的同部位SYN=1,同时选择一个初始序列号 seq=x ,此时,TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态。TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。
  3. TCP服务器收到请求报文后,如果同意连接,则发出确认报文。确认报文中应该 ACK=1,SYN=1,确认号是ack=x+1,同时也要为自己初始化一个序列号 seq=y,此时,TCP服务器进程进入了SYN-RCVD(同步收到)状态。这个报文也不能携带数据,但是同样要消耗一个序号。
  4. TCP客户进程收到确认后,还要向服务器给出确认。确认报文的ACK=1,ack=y+1,自己的序列号seq=x+1,此时,TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态。TCP规定,ACK报文段可以携带数据,但是如果不携带数据则不消耗序号。
  5. 当服务器收到客户端的确认后也进入ESTABLISHED状态,此后双方就可以开始通信了。

TCP协议的四次挥手

● 数据传输完毕后,双方都可释放连接。最开始的时候,客户端和服务器都是处于ESTABLISHED状态,然后客户端主动关闭,服务器被动关闭。

  1. 客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
  2. 服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
  3. 客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
  4. 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
  5. 客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗ *∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
  6. 服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。

面试题

1.洪水攻击
同一时间有大量的客户端请求建立链接,会导致服务端一致处于SYN_RCVD状态
很难避免,可以慢慢提升上限
降低洪水攻击带来的影响:在中间设置一个缓冲池(半连接池),当所有人来了后,先在缓冲池中排队。例如:只留10个人排队,剩下的全部驳回,这10个人一个一个建链接
'''面试题(并发中也有方法解决)'''

2.服务端如何区分客户端建立链接的请求
可以对请求做唯一标识(seq=x,用不一样的英文字母来区分)

3.四次不能合并为三次
因为中间需要确认消息是否发完(TIME_WAIT状态->等待状态)

4.3 UDP协议

也称之为数据报协议、不可靠协议
不会建立双向链接。如果使用UDP协议,客户端只负责发送数据,至于对方收到没收到,不关心

4.4 数据段(segment)

5.应用层

应用层相当于是程序员自己写的应用程序 里面的协议非常的多

  1. 如果是客户端程序,协议想用什么就用什么,因为客户端是我们自己写的
  2. 如果是浏览器,协议就不能随意用了,就要按照浏览器规定的协议,因为浏览器不是我们自己写的,

http协议

浏览器使用的协议:http协议,默认端口号:80

  • http://www.baidu.com:80/v2/api/?login

    解析:

    • https: -- 协议
    • // ----- 分隔符
    • www.baidu.com: -- 域名
    • 80 --- 端口,此时的80可省略
    • v2/api --- 路径
    • ?login --- ?参数,放在?后面的都是参数

https: http + ssl证书

http和https的区别

  1. https更加安全,密文传输数据
  2. http不安全,明文传输数据
  3. https协议监听的默认端口是:443
posted @ 2023-03-31 19:40  星空看海  阅读(22)  评论(0编辑  收藏  举报