网络编程篇

本文详细介绍了软件开发架构,包括C/S和B/S架构,以及OSI七层协议中的物理层、数据链路层、网络层、传输层和应用层,重点讲解了TCP和UDP协议的三次握手和四次挥手过程。此外,还讨论了IPv4和IPv6的区别,以及UDP协议的优缺点。
摘要由CSDN通过智能技术生成

目录

一、软件开发架构

二、 OSI七层协议

1、什么是网络? 什么是上网?

2、互联网通信协议(osi七层协议)

3、物理层

4、数据链路层

 5、网络层

6、传输层

7、 应用层

三、TCP和UDP协议

1、背景描述

2、三次握手(TCP建立链接)

3、四次挥手(TCP断开链接) 

 4、UDP协议


一、软件开发架构

网络编程:我们要编写一款基于网络传输的软件

引子:我们现在以ATM为例,现在写的ATM别人是不能够访问的,只能我们自己用,但是,这不是目的,目的是我们要写一款ATM,然后让所有人都能够访问。

如果想让别人下载使用我们的软件,我们需要开发一款客户端,然后让用户在自己的电脑上下载这个客户端就能用了,还需要有一个服务端,比如,以ATM为例,用户下载客户端之后,用户需要输入用户名和密码登录,然后把用户名和密码提交到服务端做校验,提交到的地方就是服务端。

Client                                                                                                    Server

客户端-----------------------------------网络传输-----------------------------------服务端

我们通常称为这种架构为C/S架构 

然而客户端服务端是存在一定的问题的:当我们需要下载大量的软件的时候,会占用大量的资源;其次,就是使用起来不方便。因此,这个时候,就有人站出来开发了浏览器。那么,这个浏览器其实也是一个客户端,浏览器它是一个万能客户端(超级客户端)。

Browser                                                                                                             Server

浏览器(客户端)-----------------------------------网络传输-----------------------------------服务端

我们通常称为这种架构为B/S架构 

本质上B/S架构也是C/S架构!!!

补充:当下我们使用的软件架构模式是二者兼有!
很多的公司开发的软件都是小程序(微信),为了转换更加容易一些。

拓展:

服务端的特征:
    1. 24小时不间断对外提供服务
    2. 服务端要有一个公网IP(服务器部署,它就是另外一台计算机,系统:Linux系统, Centos、乌班图等)
    3. 常见的服务器:阿里云、腾讯云、百度云、华为云等

二、 OSI七层协议

1、什么是网络? 什么是上网?

上网其实就是上传和下载数据的过程

背景:
        在早期的时候,其实世界范围内的计算机是不能够互相通信的,当时的计算只是在局域网中通信;后来呢,世界范围内的计算机也通信了,在广域网中通信,这就是互联网。

网络的组成:物理链接设备(路由器、交换器、网线等) + 计算机界的英语(互联网通信协议)

2、互联网通信协议(osi七层协议)

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

每一层都运行不同的协议。协议是干什么的,协议就是标准。

实际上还有人把它划成五层、四层。 

七层划分为:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层

五层划分为:应用层、传输层、网络层、数据链路层、物理层

四层划分为:应用层、传输层、网络层、网络接口层

 

3、物理层

物理层功能:它是专门用来发送高低电频的,其实就是二进制(0和1) 

物理层字面意思解释:物理传输、硬件、物理特性。在深圳的你与北京的朋友聊天,你的电脑必须要能上网,物理体现是什么?是不是接一根网线,插个路由器,北京的朋友那边是不是也有根网线,也得插个路由器。也就是说计算机与计算机之间的通信,必须要有底层物理层方面的连通,就类似于你打电话,中间是不是必须得连电话线。中间的物理链接可以是光缆、电缆、双绞线、无线电波。中间传的是电信号,即010101…这些二进制位。

物理层单纯的发送电频是没有任何的意义的,因为不知道发送的电频什么意思,所以,需要对发送的电频进行分组,但是呢,物理层做不了分组。

4、数据链路层

数据链路层的功能:就是专门用来对物理层发送过来的数据进行分组的,该层使用的以太网协议ethernet

ethernet规定:一组电信号构成一个数据报,叫做’帧’,或者叫数据帧,数据帧的组成:报头head和数据data两部分。

●   head包含:(固定18个字节)
     ○ 发送者/源地址,6个字节
     ○ 接收者/目标地址,6个字节
     ○ 数据类型,6个字节

●   data包含:(最短46字节,最长1500字节)

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

Mac地址:以太网协议规定,每一个接入互联网的设备都必须要有一个网卡,发送端和接收端的地址便是指网卡的地址,即Mac地址。

Mac地址:每块网卡出厂时都被烧制上一个世界唯一的Mac地址,长度为48位2进制,通常由12位16进制数表示(前六位是厂商编号,后六位是流水线号)。

通过一个Mac地址能不能确定局域网中的唯一一台计算机? ------> 能确定

 5、网络层

网络层功能:引入一套新的地址用来区分不同的广播域/子网,这套地址即网络地址。

该层使用的是IP协议,规定每一个接入互联网的计算机都必须要有一个IP地址,网络层中的数据我们称为是数据包,IP地址的组成格式。

 分类:IPv4、IPv6, 目前大多数用的都是IPv4,由于IPv4地址即将耗尽,所以,其他场景开始使用IPv6。

IPv4:十进制表示法

范围0.0.0.0------------------------------------------------------->255.255.255.255 

00000000.00000000.00000000.00000000------------- >11111111.11111111.11111111.11111111

192.168开头的地址基本上都是局域网中得ip地址

公网ip:需要购买的,阿里云、腾讯云的,人家会给你一个公网ip地址,固定的,不会变。172.0.1.200

内网ip:192.168开头的地址基本上都是局域网中得ip地址 。

IPv6:十六进制表示法

如何查看自己的IP地址:
            Windows:cmd-----> ipconfig
            Linux(macOS):cmd-----> ifconfig

其实通过一个IP地址它是可以定位唯一一个局域网

IP+Mac地址确定世界范围内的唯一一台计算机? -----> 是的

但是我们知道,现在只需要一个IP地址就能够确定唯一一台计算机,那是因为:ARP协议,它能够通过你的IP地址计算出Mac地址,归根结底还是:IP+Mac地址 。

本地回环地址:127.0.0.1(我们自己的电脑)

192.168.1.252 == 127.0.0.1  localhost (这两个有时候会有区别)

6、传输层

传输层功能:建立端口到端口的通信。

该层使用的是TCP协议或者是UDP协议,暂且忽略,它也称之为是端口协议,一个端口可以代表一个应用程序。

端口范围0-65535,0-1023为系统占用端口

1. 0-1024之间的端口号都是系统自己使用的
2. 1024-8000之间的端口号一般是常用软件的端口号
             MySQL:3306
             Django:8000
             flask:5000

             HTTP:80

             HTTPS:443
             ...
3. 我们自己开发的软件,端口一般选择8000之后的到65535

同一个端口号只能够表示一个正在运行的应用程序,端口号不能够冲突,但是,软件一旦关闭,就会释放出来占用的端口号,别的应用程序就能够使用了。 

常用软件的端口号:

7、 应用层

应用层功能:规定应用程序的数据格式。

该层就是离用户最近的一层;比如,微信、QQ、腾讯会议、pycharm等都是一个一个的应用,他们都在应用层。

1. 客户端:你想使用什么协议都行,自己开发的软件,协议你自己选择

2. 浏览器:你就不能够随便使用了,就要安装浏览器规定的协议使用,而浏览器使用的协议恰好是HTTP协议

3. Https协议
        HTTP协议     HTTPS协议
        https://www.baidu.com/
        协议://域名/v1/v2?参数
        https://www.baidu.com/s?wd=%E7%BE%8E%E5%A5%B3

HTTP协议:
                1. 是明文传输数据
                2. 不安全

HTTPS协议:
                   1. 是密文传输数据
                   2. 安全
               https = http + ssl证书(它是需要申请的,国际机构,公钥、私钥等)
               nginx服务器:配置文件,需要在配置文件中配置一些东西,就能够把你的http改成https

域名解析:
        DNS服务器它就是用来解析域名的,域名的本质其实就是IP地址,域名比IP地址好记,最终还是需要把域名解析成IP地址。

域名的解析过程:
        1. 首先会先从本地开始解析hosts文件
        2. 会去对应平台的域名关系表中取查询 

三、TCP和UDP协议

1、背景描述

通过OSI七层网络模型中IP层的介绍,我们知道网络层,可以实现两个主机之间的通信。但是这并不具体,因为,真正进行通信的实体是在主机中的进程,是一个主机中的一个进程与另外一个主机中的一个进程在交换数据。IP协议虽然能把数据报文送到目的主机,但是并没有交付给主机的具体应用进程。而端到端的通信才应该是应用进程之间的通信。

TCP(也称为是可靠协议),客户端要想给服务端发送消息,在传送数据之前必须先建立连接,数据传送完成后要释放连接。因此TCP是一种可靠的的运输服务,但是正因为这样,不可避免的增加了许多的开销,比如确认,流量控制等。对应的应用层的协议主要有 SMTP,TELNET,HTTP,FTP 等。

2、三次握手(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状态,此后双方就可以开始通信了。 

3、四次挥手(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连接的时间要比客户端早一些。

一定是客户端先给服务端发送消息,然后,服务端给客户端做返回信息
有个个例,服务端可以先给客户端发送消息,需要使用websocket协议,一般用在即时通信软件 。客服系统、微信、QQ等都是。

面试题:

1. TCP协议的可靠性,是因为建立了双向通道?

不是。是因为TCP协议的反馈机制

2. 四次挥手能不能省略为三次挥手? 

不能。

建立连接的时候,服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。

 4、UDP协议

UDP,在传送数据前不需要先建立连接,远地的主机在收到UDP报文后也不需要给出任何确认。虽然UDP不提供可靠交付,但是正是因为这样,省去和很多的开销,使得它的速度比较快,比如一些对实时性要求较高的服务,就常常使用的是UDP。对应的应用层的协议主要有 DNS,TFTP,DHCP,SNMP,NFS 等。

它不可靠,是因为它不建立链接,没有三次握手、四次挥手;但是速度快。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值