1 网络编程
2 OSI七层协议
3 TCP协议和UDP协议
1. 为什么客户端最后还要等待2MSL?
2 为什么建立连接是三次握手,关闭连接确是四次挥手呢?
3 如果已经建立了连接,但是客户端突然出现故障了怎么办?
1 网络编程
网络编程:我们要基于网络来编写一款B/S或者是C/S架构的软件
一系列统一的标准,这些标准称之为互联网协议,互联网的本质就是一系列的协议,
总称为“互联网协议”(Internet Protocol Suite)。
互联网协议的功能:定义计算机如何接入 Internet,以及接入 Internet 的计算机通信的标准
2 OSI七层协议
1. 什么是网络?
网络的本质就是:上传和下载数据的过程
"""
世界上最初的计算机是不能互相通信的,只是在局域网中通信,随着技术的发展,
世界范围开始通信,通过网络通信,即互联网通信
"""
网络的组成部分:物理连接设备(网线、交换机、路由器等)+计算机通信协议
2. 互联网通信协议(OSI的七层协议)
物理层
数据链路层
网络层
传输层
会话层
表示层
应用层
3. 五层协议
物理层
数据链路层
网络层
传输层
应用层
****************************************************************
1.物理层:
是专门用来发送高低电频的
注意1:
单出的发送高低电频没有意义,需要对电频进行分组,以表示不同的意思
注意2:
物理层是不能做分组的
----------------------------------------------------------------
2.数据链路层
是专门用来做分组使用的
数据链路层称之为是一个数据帧,数据帧有两部分组成:head(报头)+data(真实数据)
head部分:固定18个字节,即:
发送者/源地址,6个字节
接收者/目标地址,6个字节
数据类型,6个字节
data:最短46个字节
数据的具体内容:head长度 + data长度 = 最短64字节
"""
数据链路层使用的是以太网协议,以太网协议规定,任何接入互联网的计算机都应该有一个网卡,
默认的就叫以太网
"""
MAC地址:每一个网卡都要有一个Mac地址,每块网卡出厂时都被烧纸上一个世界上唯一的Mac地址,
长度48位二进制,通常由12位16进制表示
Mac地址可以确定局域网中唯一一台计算机
----------------------------------------------------------------------
3.网络层
网络层使用的是IP协议,IP协议规定接入互联网的计算机都必须要有一个IP地址,
网络层的数据称之为是数据包,IP地址的分类:IPv4、IPv6
IP地址:ip地址可以确定世界范围内任意的一个局域网
IP地址的组成:
IPv4地址的格式
0.0.0.0 ------------------------ 255.255.255.255
000000000.00000000.00000000.00000000 ----------- 11111111.11111111.11111111.11111111
如何查看自己的电脑的IP地址:
windows系统:ipconfig
linux(macos):ifconfig
1.公网IP:固定的,不变,需要购买的(服务器),阿里云、腾讯云、百度云等
例如,172.12.1.101
2.内网IP:
例如,192.168.1.63 这是会变的
子网掩码:IP + 子网掩码
"""
IP地址+MAC地址可以确定世界范围内唯一一台计算机
"""
一般情况下,只需要IP地址就可以确定世界范围内的唯一一台计算机,为什么呢?
因为:有一个叫 arp 协议,可以根据IP地址计算出来Mac地址,所以,有了IP地址就相当于有了Mac地址。
'''
arp协议由来:计算机通信基本靠吼,即广播的方式,所有上层的包到最后都要封装上以太网头,
然后通过以太网协议发送,在谈及以太网协议时候,我门了解到通信是基于mac的广播方式实现,
计算机在发包时,获取自身的mac是容易的,如何获取目标主机的mac,就需要通过arp协议
arp协议功能:广播的方式发送数据包,获取目标主机的mac地址
'''
注意:
本地回环地址:127.0.0.1(就是找自己的电脑)
----------------------------------------------------------------------
4. 传输层
传输层使用的TCP协议和UDP协议,也称为端口协议,我们一般使用端口来表示一个个的应用程序
一个端口表示一个正在运行的应用程序
端口:0-65535
"""
1. 0-1024之间的端口号一般是系统使用的,我们尽量不要使用,否则有可能会造成端口冲突
2. 1025-8000之间的端口号一般是常用软件的端口号
MySQL的默认端口号:3306
Django的默认端口号:8000
3.我们开发的软件,尽量使用8000以后的端口
"""
常用软件的端口号:
应用层 FTP TFTP TELNET SMTP DNS HTTP SSH
MySQL 3306
熟知端口 20,21 69 23 25 53 80 22
DNS:域名解析
baidu.com
jd.com
'''
域名的本质其实就是IP地址,域名最终还是要解析成对应的IP地址,才能找到IP对应的计算机
'''
例如: baidu.com --------DNS------- 172.12.1.1
是因为我们有个地方保存了域名和IP地址的对应关系
假设:baidu.com 127.0.0.1
注意:有的文件没有后缀是因为文件名是给我们看的,而文件是可以有后悔也可以没有后缀,linux中,一切皆文件
例如,查看保存的IP地址
1.先从自己电脑中的host文件中查找
2.若host文件中没有找到对应的关系,再去对应平台的关系中查找
3.域名是需要购买的,并且是需要备案的
---------------------------------------------------------------------
5.应用层
Application
应用层才程序员离的最近的一层
1.客户端:想用什么协议就用什么协议,客户端是我们自己开发的
2.浏览器:我们就不能随便使用协议了,就要按照浏览器协议HTTP
3.HTTP协议
HTTPS协议
假设网址:https://www.baidu.com?tn=23324302_42_hao_pg
协议:https://域名:端口/v1/v2?参数
'''
http特征:
1.不安全,因为经过http协议的数据都是明文传输的
https协议:
2.安全的,经过https协议传输的数据都是密文传输
https = http + ssl证书
ssl证书:要机构申请,国际组织,怎么用呢?
NGINX服务器,需要再Nginx服务器的配置文件中配置一些代码才能使用
'''
互联网协议按照功能不同分为OSI七层或 TCP/IP 五层或 TCP/IP 四层
OSI七层协议数据传输的封包与解包过程
3 TCP协议和UDP协议
TCP协议的三次握手和四次挥手
TCP协议也叫可靠协议,流式协议(数据是可以多次发送的)
三次握手 ----------------> 为了建立链接
四次挥手 ----------------> 断开链接
TCP协议的三次握手为什么可以保证数据安全?是因为建立了双向通道吗?
原因是:TCP协议的反馈机制
面试题:
1.为什么建立连接是三次握手?关闭连接却是四次握手呢?
'''
客户端与服务端之间一定是客户端先向服务器发起请求,而不能反过来
特殊情况:
服务端可以主动向客户端发起请求,websocket协议,一般用在即时通信软件中
'''
UDP协议:
1.不建立双向连接,也没有三次握手
2.速度快
1. 为什么客户端最后还要等待2MSL?
MSL(Maximum Segment Lifetime),TCP允许不同的实现可以设置不同的MSL值。
1.保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK报文可能丢失,
站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,
应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次,
而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器。
2.防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中。
客户端发送完最后一个确认报文后,在这个2MSL时间中,
就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。
这样新的连接中不会出现旧连接的请求报文。
2 为什么建立连接是三次握手,关闭连接确是四次挥手呢?
建立连接的时候,服务器在listen状态下,收到建立连接请求的SYN报文后,
把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,服务器收到对方的FIN报文时,
仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,
所以己方可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,
因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。
3 如果已经建立了连接,但是客户端突然出现故障了怎么办?
TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,
白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,
若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,
以后每隔75秒发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,
接着就关闭连接。