TABLE OF CONTENTS
深入Web请求过程
Web请求过程
1 | http +----------+ |
DNS域名解析
资源记录(Resource Records)
所有RRs的顶层格式都相同。
1 | 1 1 1 1 1 1 |
格式说明:
1 | NAME an owner name, i.e., the name of the node to which this |
一级域名:主机名+域名后缀。例如:tsukasa.moe
二级域名:一级域名下面的主机名。例如:www.tsukasa.moe
浏览器缓存->操作系统缓存(host)->本地域名服务器(LDNS)->根域名服务器->主域名服务器(gTLD Server)->Name Server
DNS工具
host
nslookup
dig
这三个工具功能丰富度、复杂度依次递增,其中nslookup在windows中也可以使用。
dig命令用法:
- dig tsukasa.moe
- dig tsukasa.moe ns
- dig tsukasa.moe mx
- dig tsukasa.moe +trace
nslookup命令用法:可以使用交互或非交互模式进行查询。
- 直接输入nslookup进入交互式模式,默认连接到默认域名服务器(即/etc/resolv.conf的第一个dns地址),输入域名即可查询。
- 交互模式中,使用set type=mx可以修改要查询的记录类型,再输入域名即可返回相应结果
- 非交互模式下,nslookup - 127.0.0.1即设置域名服务器ip
host命令用法:
host baidu.com -> 默认输出只有A和MX记录
host -a baidu.com -> 输出与dig baidu.com一样的信息
host -t ns baidu.com -> -t是指定type,可以用host –help查看
host -C baidu.com -> 查询SOA权威域名服务器
常见域名解析记录类型
TTL:缓存失效时间。
MX优先级:数值越低,优先级越高
记录类型 | 定义 | 示例 | 说明 |
---|---|---|---|
A记录 | 将域名指向一个ip | 主机记录www,记录值127.0.0.1 | 将二级域名www.tsukasa.moe映射到127.0.0.1 |
CNAME记录 | 将域名指向另一个域名,再由另一个域名提供IP地址 | 主机记录@,记录值www | 将 |
MX记录 | 设置邮箱,让邮箱能够收到邮件 | 主机记录@,记录值填域名m.tsukasa.moe或IP地址,MX优先级5 | 邮箱地址为xxx@m.tsukasa.moe |
NS记录 | 将子域名交给其他DNS服务商解析 | 主机记录www,记录值DNS服务器域名f1g1ns1.dnspod.net | 将子域名www.tsukasa.moe授权给DNS服务器解析 |
AAAA记录 | 将域名指向一个 IPv6 地址 | 主机记录www,记录值ipv6地址1030::C9B4:FF12:48AA:1A2B,线路类型为联通 | 连通用户单独访问1030::C9B4:FF12:48AA:1A2B |
SRV记录 | 标识某台服务器使用了某个服务,常见于微软系统的目录管理 | 主机记录_sip._tcp(格式:服务的名字.协议的类型),记录值0 5 5060 sipserver.tsukasa.moe(格式:优先级 权重 端口 目标地址) |
参考
https://tools.ietf.org/html/rfc1035
https://skyao.io/learning-dns/
http://luodw.cc/2015/12/27/dns03/
https://blog.csdn.net/a19881029/article/details/19486949
CDN工作机制
内容分布网络(Centent Delivery Network):一种先进流量分配网络,用户可以就近边缘节点访问网站发布内容,响应快速。
CDN=镜像+缓存+整体负载均衡
负载均衡通常有3种架构:链路负载均衡、集群负载均衡、操作系统负载均衡
- 链路:DNS解析来完成
- 集群:分硬件、软件负载均衡两种,硬件负载均衡如F5设备,较为昂贵。
深入分析Java I/O的工作机制
I/O接口分类
- 字节:InputStream和OutputStream
- 字符:Reader和Writer
- 磁盘:File
- 网络:Socket
前面两组主要是传输数据的数据格式,后两组是传输数据的方式,可以组合使用。
文件是操作系统与磁盘交互的最小单元,最小的存储单元是字节,而非字符。
1.标准访问文件的方式
1 | read() write() |
2.直接I/O方式:应用程序直接访问磁盘数据,而不经过操作系统内核缓冲区,加载速度慢。
3.同步访问:性能较差。
4.异步访问:当请求数据返回后继续处理下面的操作,可以提高应用效率,但不改变访问文件的效率。
5.内存映射:将内存中某一块区域与磁盘中的文件关联起来,访问内存中的一段数据时,转为访问文件的某一段数据。
Java序列化
- 将一个对象转化为二进制表示的字节数组,通过保存或者转移这些字节数据可以实现持久化,继承java.io.Serializable接口即可实现序列化。反序列化则是将这个字节数组重新构造成对象。
- 序列化的属性是对象,则属性类也需要实现Serializable接口
网络I/O
- 三次握手四次挥手
- TCP拥塞控制
Java Socket机制
- 应用程序间通信,通过Socket建立连接,建立连接则必须由底层TCP/IP建立TCP连接,一台主机上有多个程序,通过TCP或UDP的地址即端口号可以与对应的应用进行通信。
Java NIO
BIO(阻塞I/O):可以采用线程池减少线程创建和回收的成本,提高重用率。
NIO:Channel和Selector关键组件。有个比喻很形象,如果把Channel比作汽车或高铁,那么Selector比作车辆运行调度系统,负责监控每辆车的状态,Buffer则是汽车上(Channel)的座位。
Buffer工作方式:
position, capacity, limit, mark
HeapByteBuffer | DirectByteBuffer | |
---|---|---|
存储位置 | Java Heap中 | Native内存中 |
I/O | 需要在用户地址空间与内核地址空间中复制数据 | 不需要复制 |
内存管理 | Java GC回收,创建和开销少 | System.gc()释放Java对象引用的DirectByteBuffer内存空间,长期持有可能导致Native内存泄漏,创建和回收内存开销大 |
适用场景 | 并发连接数少于1000,I/O操作较少 | 数据量大、生命周期长的情况 |
深入理解Java Web中的编码问题
编码:字符编码,字符到字节,转为机器能够理解的语言,计算机只认识0和1。
解码:字节流解码,字节到字符,转为人类容易理解的语言。
无论是存储还是传输,不管是文件还是图片、视频,在计算机存储上一视同仁,全部是0和1的序列,都以字节的形式存在。
从方便人们阅读的角度,文件分为文本文件和二进制文件(非文本文件),文本文件的可视形式是文本字符,例如Test.java,存储时以某种编码格式进行编码,显示时以对应编码格式进行解码,方便文本编辑器、查看。
不同的编程语言中,提供了专门用于读写文本文件的类。Java中文本文件读写有BufferedReader和BufferedWriter.
I/O操作中的编码
- 写入存储要编码,对磁盘写,网络上写,传输以流的方式进行,如果读取的是字符需要编码为字节,写入的内容需要指定编码Charset
- 读取要解码,对磁盘读出来的数据解码,对网络上获取的流解码,读取字节解码为字符,具体解码过程需要用户指定Charset,默认使用本地环境的字符集,中文环境是GBK编码
- 用什么编码写入,就用什么编码读出来,参考示例程序。
内存操作中的编码
- 常见的是字符串到字节的数据类型转换,String str = “中文字符串”; str.getBytes(‘UTF-8’); String s = new String(b, “UTF-8”);
- Charset类提供encode, decode方法,分别对应
char[]到byte[]
和byte[]到char[]
,通过forName(String)方法设置字符集1
2
3Charset charset = Charset.forName("UTF-8");
ByteBuffer byteBuf = charset.encode(str);
CharBuffer charBuf = charset.decode(byteBuf);
乱码问题
本质是编解码使用了不同的编码格式,乱码的呈现是屏幕,是人的视觉感受。出现在磁盘文件的读写,网络数据传输,数据库存取。
编码的类型:
todo…
参考:
https://blog.csdn.net/Alexshi5/article/details/79513018
声明:本站所有文章均为原创或翻译,遵循署名 - 非商业性使用 - 禁止演绎 4.0 国际许可协议,如需转载请确保您对该协议有足够了解,并附上作者名 (Tsukasa) 及原文地址