开发人员必须知道的网络基础知识

开发 前端
以下每层列出的协议,都能够在代码或者操作系统中使用和管理,当程序进行网络通信时,需要由这些协议共同协作完成。

 一、五层网络模型

1. 主要的网络协议

[[322750]]

以下每层列出的协议,都能够在代码或者操作系统中使用和管理,当程序进行网络通信时,需要由这些协议共同协作完成。

应用层,包括HTTP、TLS(SSL3.1)、DNS、Thrift、FTP等

传输层,TCP(传输控制协议)、UDP(用户报文协议)

网络层,IP(网际协议)

链路层,ARP(地址解析协议)

物理层,该层与硬件关系更为紧密,无需太过关注

 

开发人员必须知道的网络基础知识

 

程序运行过程图解

2. 网络通信的过程

网络通信的过程

在程序中发送HTTPS请求时,数据经过各层的处理,最终到达目标地址。对各层处理的主要部分进行了描述,其中第1、2、3步在程序中进行,第4、5、6步在操作系统内核中进行,第7步由硬件设备完成,下面对每一步进行详细描述:

DNS解析将域名转换为IPv4或IPv6地址,它依托于UDP协议向DNS服务器发送查询请求并获取响应信息。

HTTP报文由程序中的httpclient工具生成,包含用户设置的HTTP相关参数(URL、header、body等)。

TLS协议通过四次握手机制协商出公钥/私钥,客户端生成“会话密钥”由公钥加密发送到服务端,服务端通过私钥解密获取,最终使用该“会话密钥”对HTTP报文进行加密。

TCP连接通过三次握手机制建立,HTTP报文以字节流形式写入,发送的数据都需要经过“发送-确认”的过程,以保证其完整送达到指定IP地址。

IP数据包将字节流按MTU大小进行拆分,局域网内通常为1500字节,互联网通常为512字节。IP数据包的头信息上记录了发送者IP和接收者IP。

MAC帧在发送时,实际无法直接发送到指定的IP地址,需要内核根据路由表中记录的信息(本地路由表查看命令route -n),通过“IP地址与子网掩码”进行“与运算”得到下一跳的网关IP。然后,链路层通过ARP协议获取网关IP的MAC地址(本地ARP缓存表查看命令arp -a),将发送者MAC地址和网关MAC地址封装到MAC帧中。

二、关键的外部服务

上一节描述的网络通信过程,需要多种外部服务的参与才能完成,包括DNS服务、CA服务、路由器、ISP服务。

1. DNS服务

DNS服务器由DNS服务提供商进行管理,提供根据域名查询IP地址的服务,常见的DNS服务提供商有中国电信(114.114.114.114)和谷歌(8.8.8.8),Linux系统中在文件/etc/resolv.conf中和目录/etcc/sysconfig/network-scripts/下使用cat命令查看配置的DNS服务器IP地址。

2. CA颁发与验证服务

CA服务器提供了TLS协议中需要的证书颁发服务,在TLS进行四次握手时通过CA服务验证服务器提供的证书是否可信。浏览器内置了多种CA服务器的地址,并且也可以在本地配置证书进行验证(如:12306.cn需要在浏览器安装私有证书)。

3. 路由器

路由器是个人电脑发送IP数据包到互联网的第一道网关,路由器内置了相关ISP服务器的信息。

4. ISP服务器

ISP(Internet Service Provider)互联网服务提供商(如:中国电信、中国联通)是网络服务的关键角色,ISP服务器的作用与路由器相同,它们记录了庞大的路由表提供给数据链路层进行查询。当我们想要将自己的服务器接入到互联网中,需要付费给ISP进行注册,本质就是在ISP服务添加了自己服务器的路由信息(实际还涉及到光纤建设等物理层实施,这里不做描述)。

责任编辑:华轩 来源: 今日头条
相关推荐

2018-04-08 10:08:43

开发人员工具

2019-11-25 09:41:28

开发者技能工具

2009-06-25 09:04:22

.NET开发人员

2023-05-11 16:29:39

Javascript开发前端

2017-10-11 15:50:18

光纤通信传输

2010-03-24 09:54:27

PHPPython

2023-04-11 15:22:06

JavaScript开发前端

2022-10-17 15:33:46

前端开发数组

2022-03-08 16:56:34

过滤器索引存储

2013-06-14 08:47:45

2009-06-22 09:13:55

测试开发人员

2017-10-24 11:59:41

JavaScript

2009-09-10 14:18:03

PHP库

2010-02-04 11:29:57

ibmdwLotus

2009-04-14 22:10:06

LinuxopenSUSE网络

2020-12-03 15:10:31

Linux开发

2010-11-02 15:26:32

MVC开发工具

2022-12-01 10:05:19

2017-10-11 13:20:56

Linux命令工程师

2017-04-12 09:24:45

开发编程Java
点赞
收藏

51CTO技术栈公众号