网络编程 | tcp协议 | udp协议 | 三次握手与四次挥手

网络编程

为什么要用网络编程

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

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

img

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

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

![GIF 2022-1-11 17-25-45](E:\gif文件\GIF 2022-1-11 17-25-45.gif)

软件开发的结构

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

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

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

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

1、 C/S架构

C/S即:Client(客户端)与Server(服务端) ,中文意思:客户端与服务器端架构。这种架构也是从用户层面(也可以是物理层面)来划分的。

这里的客户端一般泛指客户端应用程序.exe,程序需要先安装后,才能运行在用户的电脑上,对用户的电脑操作系统环境依赖较大。

img

2、B/S架构

B/S即 :Browser(浏览器)与Server(服务端),这种架构是从用户层面来划分的。

Browser浏览器,其实也是一种Client客户端,只是这个客户端不需要大家去安装什么应用程序,只需要在浏览器上通过HTTP请求服务器端相关的资源,客户端Browser浏览器就能进行增删改查。

img

网络基础

一个程序如何在网络上找到另一个程序?

首先,程序必须要启动,其次,必须有这台机器的地址,我们都知道我们人的地址大概就是国家\省\市\区\街道\楼\门牌号这样。那么每一台连网的机器在网络上也有自己的地址,他的地址是怎么表示的呢?
在网络中:ip地址精确到具体的一台电脑,而端口精确到具体的程序。

ip地址

IP地址是指互联网协议地址(英语:Internet Protocol Address,又译为网际协议地址),是IP Address的缩写。IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。

IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节)。IP地址通常用“点分十进制”表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之间的十进制整数。例:点分十进IP地址(100.4.5.6),实际上是32位二进制数(01100100.00000100.00000101.00000110)。

什么是端口

"端口"是英文port的意译,可以认为是设备与外界通讯交流的出口。

远程数据传输发展史

网络编程其实研究的就是程序之间的数据通信。

网络编程的由来: 基于远程传输数据的技术最早诞生于美国军方(前沿计数通常都是由军事产生)

1.有线电话 :通过电话线互联 
2.无线电话 :信号发射器
3.打屁股电脑 :网线
4.笔记本电脑 :网卡
...
故: 要想实现远程数据交互的前提是必须要有物理连接介质。
除了有物理连接介质之外还应该有一些能够保证数据彼此无障碍交互的东西
这个就是OSI七层协议

OSI七层网络模型

前言

我们知道一个完整的计算机系统是由硬件、操作系统、应用软件三者组成,具备了这三个条件,一台计算机系统就可以自己运作了,自己和自己玩。(打一个单机游戏呀。文件之间的备份呀。)
如果你要跟别人一起玩那怎么办呢?相与别人传输数据怎么办呢?
这里就要介绍几个通信的介质。
1、交换机:能够使接入该机器的所有计算机之间彼此互联

img

2、局域网 :由交换机组成的网络。 局域网(Local Area Network,LAN)是指在某一区域内由多台计算机互联成的计算机组。一般是方圆几千米以内。局域网可以实现文件管理、应用软件共享、打印机共享、工作组内的日程安排、电子邮件和传真通信服务等功能。局域网是封闭型的,可以由办公室内的两台计算机组成,也可以由一个公司内的上千台计算机组成。

基于mac地址的数据传输,mac地址不能跨局域网传输

mac地址

head中包含的源和目标地址由来:ethernet规定接入internet的设备都必须具备网卡,发送端和接收端的地址便是指网卡的地址,即mac地址。

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

路由器

路由器:能够连接多个局域网并实现局域网之间的数据传输
路由器(Router),是连接因特网中各局域网、广域网的设备,它会根据信道的情况自动选择和设定路由,以最佳路径,按前后顺序发送信号。 路由器是互联网络的枢纽,"交通警察"。目前路由器已经广泛应用于各行各业,各种不同档次的产品已成为实现各种骨干网内部连接、骨干网间互联和骨干网与互联网互联互通业务的主力军。路由和交换机之间的主要区别就是交换机发生在OSI参考模型第二层(数据链路层),而路由发生在第三层,即网络层。这一区别决定了路由和交换机在移动信息的过程中需使用不同的控制信息,所以说两者实现各自功能的方式是不同的。
  路由器(Router)又称网关设备(Gateway)是用于连接多个逻辑上分开的网络,所谓逻辑网络是代表一个单独的网络或者一个子网。当数据从一个子网传输到另一个子网时,可通过路由器的路由功能来完成。因此,路由器具有判断网络地址和选择IP路径的功能,它能在多网络互联环境中,建立灵活的连接,可用完全不同的数据分组和介质访问方法连接各种子网,路由器只接受源站或其他路由器的信息,属网络层的一种互联设备。

img

3、互联网 :可以简单理解为是多个局域网之间彼此互联。

img

osi七层网络层具体研究

img

#  所有计算机都必须要有这七层
应用层
表示层
会话层
传输层
网络层
数据链路层
物理连接层
# 开发层面可以归纳为五层
应用层
传输层
网络层
数据链路层
物理连接层

建议记住七层

osi七层协议具体研究

 从底层到上层进行研究

1、物理连接层

提供一个物理连接口 : 网线口 无线网卡等等

2、数据链路层

1、规定了电信号的分组方式

2、以太网协议
	规定了计算机必须有一块网卡 并且网卡上面要有一个固定的一串数字
	12位 16禁止数
		前六位:产商编号
		后六位:流水线号
	上述的数字就是计算机的mac地址(类似于身份证号)

广播

3)广播
有了mac地址,同一网络内的两台主机就可以通信了(一台主机通过arp协议获取另一台主机的mac地址)
Ethernet采用最原始的方式,广播的方式进行通信,即计算机通信基本靠吼。

3、网络层

网络层的由来:有了Ethernet、Mac地址、广播的发送方式,世界上的计算机就可以彼此通信了,但世界范围的互联网是由一个个彼此隔离的小的局域网组成的,那么如果所有的通信都采用以太网的广播方式,那么一台机器发送的包全世界都会收到,这不仅效率低,更是灾难。

网络层功能:引入一套新的地址来区分不同的广播域/子网,这套地址即网络地址。
Ip协议:规定了接入互联网的计算机都必须由一个ip地址用于唯一标识。
	IPV4版本
    	最小	0.0.0.0
        最大  255.255.255.255
    IPV6版本
    	能够表示出地球上每一粒沙子
 
ip地址:能够唯一标识接入互联网中的一台独一无二的计算机。

公网ip与私网ip
	公网ip需要花钱购买并申请  (相当于百度网页 人人都可以访问)
	私网ip自带的但是无法直接基于互联网访问 (别人是无法直接访问到的)

ARP协议

arp协议: 将ip地址转换为mac地址(基于网络请求)

是根据IP地址获取物理地址的一个TCP/IP协议。
主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址。

A访问B的IP地址 :B解析mac地址发回给A。

其实就是A发请求 请求B的mac地址。

传输层

TCP协议

可靠传输,tcp数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通过TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割。
TCP协议是流式协议
当应用程序想通过TCP协议实现远程通信时,彼此之间必须先先建立双向通信通道,基于该双向通道实现数据的远程交互,该双向通道直到任意一方主动断开才会失效
重要状态:
	listen监听态:等待对方发请求
	syn_rcvd态 :忙于恢复确认建立请求

img

三次握手

建立双向通道的过程称之为三次握手,建立通道的发起者可以是客户端也可以是服务端,下面我们就以客户端先主动发起为例

客户端会朝服务端发送一个请求询问服务端:"我能不能挖一条通往你家的地道"

服务端收到请求,回复说:"好吧 你挖吧",由于TCP是双向通道,客户端挖向服务端的通道只能给客户端朝服务端发消息使用,服务端要向给客户端发消息是没办法走这一条通道的,需要自己挖一条通往客户端的通道

所以服务端在回复同意客户端挖通道的同时还会问一句:"那我能不能也挖一条通往你家的通道"

客户端收到服务端请求后客户端到服务端的通道就挖成功了,然后也会同意服务端的请求,服务端挖向客户端的通道也会成功

#  下图总结三次握手。

四次挥手

建立一个连接需要三次握手,而终止一个连接要经过四次握手

1、当服务端或者客户端不想再与对方进行通信之后,双方任意一方都可以主动发起断开链接的请求,我们还是以客户端主动发起为例

2、客户端由于已经没有任何需要发送给服务端的消息了,所以发起断开客户端到服务端的通道请求

3、服务端收到该请求后同意了 至此客户端到服务端的单项通道断开

4、服务端这个时候不会立刻朝客户端发器请求说那我也断开到你家的通道吧,服务端需要想想我手上还有没有需要发送给客户端的消息,如果还有的话,那我不能立马断开,先把数据发完才能断

5、等服务端检查完毕之后发送也没有数据要给客户端了,这个时候就会朝客户端发起断开服务端到客户端的通道请求

客户端同意该请求,至此四次挥手完成
总结:挥手必须是四次,中间的两次不能合并成一次,原因就在于需要检查是否还有数据需要给对方发送(有一个真空期)。

UDP协议

当应用程序希望通过UDP与一个应用程序通信时,传输数据之前源端和终端不建立连接。

当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。

TCP和UDP类似于

TCP:打电话(你一句我一句,你侬我侬)

UDP: 发短信(管你看不看,发了就不关我事了)

早期的QQ使用的就是UDP

端口协议

#  计算机在管理应用程序的时候 其实就是用端口来管理的
端口号 :能够唯一标识一台计算机上面正在运行的一款应用程序。

范围 : 0 ~ 65535
特性 : 动态分配
	eg :第一次运行微信,系统随机取一个端口号2222
		然后关闭微信重新启动,系统随机取一个端口号
		
端口号的基本使用:
	0 ~ 1024 系统默认需要使用的端口号。
	1024 ~ 8000 常见软件的端口号 (酷狗的端口为5000)
	故:以后我们再开发软件的时候最好使用8000之后的端口号。

# 端口号在同一台计算机同一时刻不能重复。

其实我们访问的浏览器就是IP+端口,只不过进行的域名解析。
	eg :202.108.22.5 也可以访问到百度。
	端口可以不跟 :因为这个服务器就只跑的百度一个端口。
	

比喻说明

比如你去健身房,前台都会给你一个手牌(5),用来放衣服什么的。
这个手牌是随机的,你走了之后把这个手牌再给前台。
下一个人来,前台给的手牌也可能是其他的手牌 ,也可能是你上次使用的手牌(5)

总结

IP + port 

能够唯一标识世界上某一台接入互联网的计算机上面的某一个正在运行的应用程序

应用层

都是人为自定义的协议标准 可遵循可不遵循
HTTP协议 FTP协议 ...
posted @ 2022-01-11 21:44  JasonBorn  阅读(74)  评论(0编辑  收藏  举报