01_网络编程基础理论
1.OSI七层模型: 将功能分开,降低网络传输中的耦合度,每一部分完成自己的功能,开发更加清晰
1.应用层(Application): 提供用户服务,具体内容有特定程序规定
网络服务与最终用户的一个接口
协议有: HTTP FTP TFTP SMTP SNMP DNS
2.表示层(Presentation Layer): 提供数据的压缩解压缩和加密等
数据的表示,安全,压缩
格式有,JPEG,ASCll,DECOIC,加密格式等
3.会话层(Session Layer): 建立程序的连接,决定使用什么样的传输服务
建立,管理,终止会话
对应主机进程,指本地主机与远程主机正在进行的会话
4.传输层(Transport): 提供合适的通信服务,流量控制
基于端口(port)
传输层由来: IP地址帮我们区分子网,mac地址帮我们找到主机,但却需要一个端口定位具体应用程序,端口即为应用程序与网卡的编号
传输层功能: 建立端口到端口通信,范围:0-65535,0-1023为系统占用端口
TCP协议: 面向连接可靠的数据传输,没有长度限制但不超过IP包长度,在IP包头中用2个字节描述报文长度,2个字节所能表达的最大数字就是65535
可靠传输: 无失序,无差错,无丢失,无重复
应用情况: 适用于传输内容较大,网络情况好,需要提供准确传输的情况,如聊天信息,文件传输,邮件
TCP的三次握手与四次挥手流程图: https://www.processon.com/view/link/5ef9200d7d9c0844203a1449
三次握手
1.客户端向服务器发起连接请求(问是否可以连接)
2.服务器接收到请求后进行确认(允许连接)返回报文
3.客户端收到许可,建立连接
四次挥手
1.主动方发送报文告知被动方要断开连接
2.被动方返回报文,告知受到请求,准备断开
3.被动方发送报文给主动方告知准备就绪可以断开
4.主动方发送报文确定断开
连接
TCP在真正的读写操作之前,server与client之间必须建立一个连接
当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接
短连接和长连接流程图: https://www.processon.com/view/link/5efca678e401fd1fd2bbe605
长连接
1.client 向 server 发起连接
2.server 接到请求,双方建立连接
3.client 向 server 发送消息
4.server 回应 client
5.一次读写完成,连接不关闭
6.后续读写操作...
7.长时间操作之后client发起关闭请求
短连接
1.client 向 server 发起连接请求
2.server 接到请求,双方建立连接
3.client 向 server 发送消息
4.server 回应 client
5.一次读写完成,此时双方任何一个都可以发起 close 操作
TCP长/短连接的优缺点
长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间,对于频繁请求资源的客户来说,较适用长连接
长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况,如数据库的连接用长连接
短连接对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段
短连接下客户请求频繁,将在TCP的建立和关闭操作上浪费时间和带宽
并发量大,但每个用户无需频繁操作情况下需用短连好,如WEB网站
UDP协议: 面向无连接的服务 不可靠的数据传输,报头8字节,总长不超过65535字节,刚好放进一个IP包
发送时由发送端自主进行,不考虑接收端
适用情况: 网络较差,对传输准确性要求低,广播组播
比如: 视频会议, 广播数据
物理设备: 四层交换机,四层路由器
5.网络层(Network): 路由选择,网络互联,分组传输
基于IP地址(IPv4, IPv6)
网络层由来: 世界大网路由是由一个个小的彼此隔离的局域网组成,以太网包只能在一个局域网内发送
一个局域网是一个广播域,以太网的广播只能在一个广播域内发送,跨广播域发送只能由路由转发
网络层功能: 规定网络地址的协议即IP协议,广泛采用的v4版本即ipv4,帮我们区分子网
IP协议: 网络地址由32位2进制表示,范围: 0.0.0.0-255.255.255.255
Windows用cmd查询网卡命令: ipconfig
Linux终端中查询网卡命令: ifconfig
拼命令(ICMP协议): ping 域名/网址
物理设备: 路由器(有对外身份:外网IP),三层交换机
路由器和交换机的区别
交换机的主要功能: 组织局域网,经过交换机内部处理解析信息之后,将信息以点对点,点对多的形式发送给固定端
路由器的主要功能: 跨网段进行数据传输,路由选择最佳路径
子网掩码: 表示网络特征的一个参数,形式上等同于IP地址也是一个32位二进制数字,它的网络部分全部是1,主机部分全部是0
子网掩码示例: 255.255.255.0
网络位: 255.255.255
主机位: 0
标准的子网掩码
定义: 指明一个IP地址的哪些位标识的是主机所在的子网,哪些位标识的是主机的位掩码
A类IP地址的标准子网掩码: 255.0.0.0
B类IP地址的标准子网掩码: 255.255.0.0
C类IP地址的标准子网掩码: 255.255.255.0
子网判定
1.将两个IP地址与子网掩码分别进行AND运算(两个数位都是1,运算结果是1,否则0),结果相同则在同一子网
2.通过基于ICMP协议的ping命令去ping对方的ip地址, 可以ping通也表示在同一个子网
通过网络地址判定两个IP地址在不在子网示例: A主机的IP,子网掩码,按位与计算得出A主机的网络地址: 192.168.0.100 1100 0000 1010 1000 0000 0000 0110 0100 255.255.255.0 1111 1111 1111 1111 1111 1111 0000 0000 192.168.0.0 1100 0000 1010 1000 0000 0000 0000 0000 B主机的IP,子网掩码,按位与计算得出B主机的网络地址: 192.168.0.137 1100 0000 1010 1000 0000 0000 1000 1001 255.255.255.0 1111 1111 1111 1111 1111 1111 0000 0000 192.168.0.0 1100 0000 1010 1000 0000 0000 0000 0000 A主机的网络地址和B主机的网络地址一样,所有A主机和B主机在同一个子网 通过ping命令判定两个IP地址在不在子网示例: ping 192.168.0.137 """执行结果 PING 192.168.0.137 (192.168.0.137): 56 data bytes 64 bytes from 192.168.0.137: icmp_seq=0 ttl=64 time=0.049 ms 64 bytes from 192.168.0.137: icmp_seq=1 ttl=64 time=0.161 ms 64 bytes from 192.168.0.137: icmp_seq=2 ttl=64 time=0.171 ms 64 bytes from 192.168.0.137: icmp_seq=3 ttl=64 time=0.158 ms ^C --- 192.168.0.137 ping statistics --- 4 packets transmitted, 4 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 0.049/0.135/0.171/0.050 ms """
IP地址分类
IPv4地址分类流程图: https://www.processon.com/view/link/5ef2818e5653bb2925b228f2target
A类IP地址:
一个A类IP地址由1字节的网络地址和3字节主机地址组成,网络地址的最高位必须是"0"
地址范围: 1.0.0.1-126.255.255.254 # 0和127网段有特殊意义
二进制表示为: 00000001 00000000 00000000 00000001 - 01111110 11111111 11111111 11111110
可用的A类网络有126个,每个网络能容纳1677214个主机
B类IP地址:
一个B类IP地址由2个字节的网络地址和2个字节的主机地址组成,网络地址的最高位必须是"10"
二进制表示为: 10000000 00000001 00000000 00000001 - 10111111 11111111 11111111 11111110
地址范围: 128.1.0.1-191.255.255.254
B类网络有16384个,每个网络能容纳65534主机
C类IP地址:
一个C类IP地址由3字节的网络地址和1字节的主机地址组成,网络地址的最高位必须是"110"
地址范围: 192.0.1.1-223.255.255.254
C类网络有2097152个,每个网络能容纳254个主机
D类IP地址:
D类IP地址第一个字节以"1110"开始,它是一个专门保留的地址
它并不指向特定的网络,目前这一类地址被用在多点广播(Multicast)中
用于多点广播,多点广播地址用来一次寻址一组计算机 s 地址范围224.0.0.1-239.255.255.254
E类IP地址:
以"1111"开始,为将来使用保留
E类地址保留,仅作实验和开发用
1.公有IP地址分类: inter NIC机构分配给注册组织的IP地址
2.私有IP地址分类: 私有地址(private address)属于非注册地址,专门为非组织机构使用
在这么多网络IP中,国际规定有一部分IP地址是用于我们的局域网使用,也就是属于私网IP,不在公网中使用的
私网IP地址范围:
10.0.0.0~10.255.255.255
172.16.0.0~172.31.255.255
192.168.0.0~192.168.255.255
3.回路测试IP地址: 127.0.0.1~127.255.255.255 # 用于回路测试
6.链路层(Link): 提供链路交换,具体消息发送
基于以太网卡固定的Mac地址
数据链路层由来: 单纯的电信号0和1没有任何意义,必须规定电信号多少位一组,每组什么意思
数据链路层功能: 定义了电信号的分组方式以太网协议,帮我们找到主机
ARP协议: 通过目标主机的ip地址获取目标主机Mac地址的一个协议
数据包组成:
head + data 组成的一个数据包(最短64B,最大1518B)
head = 发送者mac地址(6B)+接收者mac地址(6B)+数据类型(6B)
data: 数据包具体内容(最短46B,最大1500B)
通讯原理: 广播
物理设备: 网桥,网卡,以太网交换机
Mac地址: ac:bc:32:bf:6e:25 # 物理地址,全球唯一,前三位表示生产厂家,后三位表示生产厂家生产的那一块网卡
A主机给B主机第一次发包三步
第一步: 先计算判定A主机和B主机在不在一个子网
在一个子网内(直接通过交换机转发数据包,ip和mac都不变)
第二步:
A主机先看自己缓存区里也有没有B主机的mac地址,有的话直接到第三步
A主机通过arp协议单播发给交换机,交换机收到后在子网内广播(ff:ff:ff)
B主机收到广播数据后通过对比ip地址,发现A主机是要拿自己的mac地址
B主机通过单播回送给交换机包含自己的mac地址的包,交换机缓存B主机的ip和mac
交换机再把包通过单播发送给A主机
此时A主机成功的拿到B主机的mac地址,并将B主机的mac地址缓存到本地
第三步: A主机由单播方式发包给交换机,交换机再单播把包发送给B主机
不在一个子网内(通过交换机和路由器转发数据包,ip不变,mac改变)
第二步:
A主机先看自己缓存区里也有没有A主机所在子网路由器的mac地址,有的话直接到第三步
A主机通过arp协议单播发给交换机,此时目标ip是A主机所在子网内路由器的网关ip(例如: 192.168.1.1)
A主机所在的交换机没有缓存A主机所在子网路由器的ip和mac
A主机所在的交换机收到包后会在子网内广播(ff:ff:ff)
A主机所在的路由器收到广播数据后通过对比ip地址,发现A主机是要拿自己的mac地址
A主机所在的路由器通过单播回送给交换机包含自己的mac地址的包
此时A主机所在的交换机会缓存A主机所在的路由器的ip和mac信息
A主机所在的交换机缓存了A主机所在子网路由器的ip和mac
A主机所在的交换机收到包后会单播发送给A主机所在子网的路由器
A主机所在的路由器通过单播回送给交换机包含自己的mac地址的包
A主机所在的交换机再把包通过单播发送给A主机
此时A主机成功的拿到A主机所在子网的路由器的mac地址,并将mac地址缓存到本地
第三步:
1.A主机的数据包在A主机子网内的过程
A主机通过arp协议单播发给交换机,此时目标ip是B主机ip,而目标mac是A主机所在子网的路由器的mac地址
交换机收到A主机的包后将通过单播发送给A主机所在子网内的路由器
2.A主机的数据包在路由间的过程
A主机的包由A主机子网内的路由器转发到中间路由
中间路由再把A主机的包发到B主机所在子网的路由器
注: 中间路由的转发次数由实际A主机和B主机间的路由设备来决定
3.A主机的数据包在B主机子网内的过程
B主机所在子网的路由器将A的包发给B主机所在的交换机
B主机所在的交换机没有缓存B主机的ip和mac信息
B主机所在的交换机收到A主机的包后在B主机所在的子网内广播(ff:ff:ff)
B主机收到广播数据后通过对比ip地址,发现是A主机给自己的包
B主机所在的交换机缓存了B主机的ip和mac信息
B主机所在的交换机通过单播把A主机的数据包发送给B主机
补充:
1.如果是通过集线器发包,那么即使A主机拿到了B主机的mac地址依然是在一个通过广播方式发包
2.可以通过命令查看本地缓存的mac地址: arp -a
arp攻击-中间人攻击
正常来说A主机要给B主机发包会经历发包三步
但是在A主机给B主机发包之前,C主机先回一个基于arp协议的包告诉A主机B主机的mac地址是自己的mac地址
此时A主机会在缓存记录B主机的mac地址实际是C主机的mac地址,此时A主机向B主机发包会发给C主机
B主机等待A主机发包,但是C主机先回一个基于arp协议的包告诉B主机A主机的mac地址是自己的mac地址
此时A主机开始给B主机发包,C主机在收到A主机的包时在本地拷贝一份数据,再将数据包发送给B主机
7.物理层(Physical Layer): 物理硬件,接口
基于物理层面的链接
物理层由来: 计算机之间的物理连接网,如光纤,电缆,双绞线,无线电波
物理层功能: 主要基于电器特性发送高低电压(电信号)高电压对应数字1,低电压对应数字0
物流设备: 集线器,网线,光纤
双绞线(网线)线序
1->T568A: 绿白 绿 橙白 蓝 蓝白 橙 棕白 棕
2->T568B: 橙白 橙 绿白 蓝 蓝白 绿 棕白 棕
交叉线: T568A----T568B 用于同种设备连接(交换机连交换机)
直通线: T568A----T568A(T568B----T568B) 不同设备连接(PC机连交换机)
2.OSI五层模型(TCP/IP模型)
应用层: 应用层,表示层,会话层
传输层: 传输层
网络层: 网络层
链路层: 链路层
物理层: 物理层
3.OSI四层模型
应用层: 应用层,表示层,会话层
传输层: 传输层
网络层: 网络层
物理链路层: 链路层,物理层
4.什么是协议
网络协议概述: 网络通信中,各方必须遵守规定,包括建立连接,如何识别,消息结构等
应用层: FTP, TFTP, HTTP, HTTPS, SMTP, DNS
传输层: TCP, UDP
网络层: IP
数据链路层: ARP协议
物理层: 传输电信号
TCP/IP协议族中各协议之间的关系流程图: https://www.processon.com/view/link/5efdf74e07912929cb6e292d
TCP/IP协议传输流程图: https://www.processon.com/view/link/5efdfba1f346fb1ae58de263
5.主机,IP,PORT,网段,子网掩码,DNS,字节序
1.主机: 计算机的名称(本机 localhost)
获取主机名 In [1]: import socket In [2]: socket.gethostname() Out[2]: 'MacBook-Pro.local' 通过主机名解析IP In [3]: socket.gethostbyname('MacBook-Pro.local') Out[3]: '127.0.0.1' In [4]: socket.gethostbyname('localhost') Out[4]: '127.0.0.1' 获取服务器别名和地址 In [5]: socket.gethostbyaddr('www.baidu.com') # 返回的元祖第一项是服务器的主机名称,第二项是服务器别名,第三项是服务器地址 Out[5]: ('www.baidu.com', ['38.177.215.14.in-addr.arpa'], ['14.215.177.38']) In [6]: socket.gethostbyaddr('14.215.177.38') Out[6]: ('www.baidu.com', ['38.177.215.14.in-addr.arpa'], ['14.215.177.38'])
2.IP地址
IPv4: 点分十进制,三个点分为四个部分,每个部分范围是 0-255
示例: 192.168.1.2
127.0.0.1: 本地回环地址(本地测试ip)
0.0.0.0: 局域网可用IP
192.168.1.0: 表是网段
192.168.1.1: 网关
192.168.1.255: 广播地址
IPv6: ip地址更多
将IP地址转换为二进制: In [5]: socket.inet_aton('192.168.1.2') Out[5]: b'\xc0\xa8\x01\x02' 将二进制转换为点分十进制: In [6]: socket.inet_ntoa(b'\xc0\xa8\x01\x02') Out[6]: '192.168.1.2' 指定以v4协议还是v6协议转换 inet_pton & inet_ntop: In [7]: socket.inet_pton(socket.AF_INET, '192.168.1.2') Out[7]: b'\xc0\xa8\x01\x02' In [8]: socket.inet_ntop(socket.AF_INET, b'\xc0\xa8\x01\x02') Out[8]: '192.168.1.2' # socket.AF_INET 表示IPv4 # socket.AF_INET6 表示IPv6
3.PORT端口
定义: 端口号是地址的组成部分,在一个系统中用于区分应用程序
端口取值范围1-65535
1-255: 众所周知的端口
256-1023: 系统端口
1024-65535: 动态端口
获取一个应用的端口
In [9]: socket.getservbyname('mysql') Out[9]: 3306 In [10]: socket.getservbyname('http') Out[10]: 80 In [11]: socket.getservbyname('https') Out[11]: 443 In [12]: socket.getservbyname('ssh') Out[12]: 22 In [13]: socket.getservbyname('ftp') Out[13]: 21
4.网段: 一个局域网内ip地址的范围
5.子网掩码: 和ip地址进行&运算,得出计算计算机网段
6.DNS: 域名解析
7.字节序:
在不同的设备上针对数据类型存储的方式不同
大端序: 高字节存在低地址,例如数值14对应二进制1110按大端序存储为: 1110
小端序: 低字节存在低地址,例如数值14对应二进制1110按小端序存储为: 0111
网络字节序: 在消息的发送和接收程中都按照网络字节序的方式进行解析,其实就是采用了大端序将字节发送方式统一
6.网络通信中的单工,半双工,全双工
单工: 单项通信,要么只能收, 要么只能发,例如收音机
半双工: 发的时候不能收, 收的时候不能发,例如对讲机
全双工: 发的时候可以收, 收的时候可以发,例如电话,socket
7.多任务
CPU的调度算法: 时间片轮转,优先级调度
并行:真的多任务,cup数>=任务数,任务真的是一起执行的
并发:假的多任务,cup数<任务数,通过操作系统的各种任务调度算法,实现用多个任务一起执行
实际上总有一些任务不在执行,因为切换任务的速度相当快,看上去一起执行而已
8.静态URL
静态URL类似 域名/news/2012-5-18/110.html 我们一般称为真静态URL,每个网页有真实的物理路径,也就是真实存在服务器里的
优点: 网站打开速度快,因为它不用进行运算,另外网址结构比较友好利于记忆
缺点: 最大的缺点是如果是中大型网站,则产生的页面特别多,不好管理
SEO影响: 静态URL对SEO肯定有加分的影响,因为打开速度快,这个是本质
9.动态URL
动态URL类似 域名/DaiKuan.php?id=17,带有?号的URL,一般称为动态网址,每个URL只是一个逻辑地址,并不是真实物理存在服务器硬盘里的
优点: 适合中大型网站,修改页面很方便,因为是逻辑地址,所以占用硬盘空间要比纯静态网站小
缺点: 因为要进行运算所以打开速度稍慢,目前有服务器缓存技术可以解决速度问题,最大的缺点是URL结构稍稍复杂不利于记忆
SEO影响: 目前百度SE已经能够很好的理解动态URL,所以对SEO没有什么减分的影响(特别复杂的URL结构除外)
10.伪静态URL
伪静态URL类似 域名/course/74.html 这个URL和真静态URL类似,他是通过伪静态规则把动态URL伪装成静态网址,也是逻辑地址不存在物理地址
优点: URL比较友好,利于记忆,非常适合大中型网站,是个折中方案
缺点:
1.设置麻烦,服务器要支持重写规则,另外进行了伪静态网站访问速度并没有变快
2.因为实质上它会额外的进行运算解释,反正增加了服务器负担,速度反而变慢
3.还有可能会造成动态URL和静态URL都被搜索引擎收录,不过可以用robots禁止掉动态地址
SEO影响: 和动态URL一样,对SEO没有什么减分影响
版权:本文版权归作者
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任