计算机网络
- 网络参考模型
- DNS协议
-
- HTTP协议
-
- HTTPS
-
- TCP
-
- 特点
- TCP结构
- TCP连接管理
- 三次握手
-
- 为什么需要三次握手?
- 为什么要传回 SYN
- 传了 SYN,为啥还要传 ACK
- 四次挥手
-
- 为什么要四次挥手
- 为什么等待 2MSL后释放连接
- 字节流的协议
- TCP与UDP的区别
-
- 数据可靠性传输
-
- 滑动窗口协议与累计确认(延时ack)
- 拥塞控制
网络参考模型
原始的网络比较复杂,涉及很多方面,如下图所示:
为了简化网络的复杂度,网络通信的不同方面被分解为多层次结构,每一层只与紧挨着 的上层或者下层进行交互,将网络分层,这样就可以修改,甚至替换某一层的软件,只要层 与层之间的接口保持不变,就不会影响到其他层。
提出了:
- OSI:Open System Interconnection Reference Model,
开放系统互联参考模型。
- TCP/IP协议族;
OSI模型分为七层,TCP/IP分为五层;每层都有对应的网络协议,常见如DNS、HTTP、SMTP、TCP、UDP、IP等协议;
DNS协议
- 作用:将域名转化为IP地址;
- 域名服务主要是基于UDP实现的,服务器的端口号为53。
域名分级
域名可以划分为各个子域,子域还可以继续划分为子域的子域,这样就形成了顶级域、二级域、三级域等。
如图:
域名服务器
域名是分层结构,域名服务器也是对应的层级结构。
- 每个层的域名上都有自己的域名服务器,最顶层的是根域名服务器
- 每一级域名服务器都知道下级域名服务器的IP地址
- 为了容灾, 每一级至少设置两个或以上的域名服务器
域名解析过程
- 主机先向本地域名服务器进行递归查询;
- 本地域名服务器采用迭代查询、向一个根域名服务器进行查询;
- 根域名服务器告诉本地域名服务器、下一次应该查询的顶级域名服务器的IP地址;
- 本地域名服务器项顶级域名服务器进行查询;
- 顶级域名服务器告诉本地域名服务器,下一步查询权限域名服务器的IP地址;
- 本地域名服务器向权限域名服务器进行查询;
- 权限服务器告诉本地域名服务器所查询的主机的IP地址;
- 本地域名服务器最后把查询结果告诉主机;
本地域名服务器会把查询结果缓存起来,如果下一次请求的是同样的域名、则直接将查询结果返回;
HTTP协议
协议是
- 超文本传输协议
- 无状态的
- 请求/应答方式的
- 可扩展的
- 与 基于网络的超文本信息系统灵活的互动
HTTP报文格式
HTTP 协议的请求报文和响应报文的结构基本相同,由三大部分组成:
- 起始行(start line):描述请求或响应的基本信息
- 头部字段集合(header):使用 key-value 形式更详细地说明报文
- 消息正文(entity):实际传输的数据,它不一定是纯文本,可以是图片、视频 等二进制数据
请求报文如下图;
响应报文如下图:
HTTP请求过程
当用户在浏览器输入网址回车之后,网络协议都做了哪些工作呢?
- 首先干活的是 浏览器应用程序,他要解析出 URL中的域名
1.1 浏览器搜索自己的DNS缓存;
1.2 若没有,搜索操作系统中的缓存;
1.3 若没有,搜索操作系统的hosts文件
1.3 若没有,操作系统将域名解析请求发送值本地域名服务器(递归查询),本地域名服务器查询自己的DNS缓存、成功则返回IP地址;若没有、则
1.3.1 向根域名服务器域名解析请求发给根域名服务器、
1.3.2 根域名服务器告诉本地域名服务器,下一次应该查询的顶级域名
服务器的地址;
1.3.3 本地域名服务器向顶级域名服务器发起请求
1.3.4 顶级域名服务器告诉本地域名服务器该去哪个权限域名服务器查询;
1.3.5 本地域名服务器向权限域名服务器放弃请求
1.3.6 权限域名服务器服务器查询映射表、返回给本地域名服务器 域名对应的
对应的IP地址
1.3.7 本地域名服务器缓存结果、并将查询结果返回给主机操作系统;
1.4: 操作系统将IP地址返回给浏览器、并缓存查询结果
1.5 至此浏览器得到域名对应的IP地址;
- 三次握手建立TCP连接
- 浏览器发起HTTP请求;
- 服务器接收并解析HTTP请求、查找资源、返回HTTP响应消息;
- 浏览器收到响应之后,开始渲染页面
HTTPS
由于 HTTP 天生“明文”的特点,整个传输过程完全透明,任何人都能够在链路中截获、修改或者伪造请求 / 响应报文,数据不具有可信性。 因此就诞生了为安全而生的HTTPS协议。
这也是为什么进入一些网站、会有一些色情广告的原因…
使用HTTPS时,所有的HTTP请求和响应在发送到网络之前,都要进行 加密。
SSL/TLS
SSL 即安全套接层(Secure Sockets Layer),后面改名为TLS(传输层安全,Transport Layer Security).
摘要算法
- 摘要算法能够把任意长度的数据“压缩”成固定长度、而且独一无二 的“摘要”字符串,就好像是给这段数据生成了一个数字“指纹”。
- 任意微小的数据差异,都可以生成完全不同的摘要。所以可以通过把明文 信息的摘要和明文一起加密进行传输,数据传输到对方之后再进行解 密,重新对数据进行摘要,再比对就能发现数据有没有被篡改。这样就 保证了数据的完整性。例如MD5、SHA1等、
加密算法
- 对称密钥加密算法:编、解码使用相同密钥的算法,如(AES, RC4,ChaCha20 )
- 非对称密钥加密算法:它有两个密钥,一个叫“公钥”,一个叫“私 钥”。两个密钥是不同的,公钥可以公开给任何人使用,而私钥必须严格保密。非对称加密可以解决“密钥交换”的问题。网站秘密保管私钥,在网上任意分发公钥,你想要登录网站只要用公钥加密就行了,密文只能由私钥持有者才能解密。而黑客因为没有私钥,所以就无法破解密文。非对称密钥加密系统通常需要大量的数学运算,比较慢。
TLS 里使用的混合加密方式,即把对称加密和非对称加密结合起来呢, 两者互相取长补短,即能高效地加密解密,又能安全地密钥交换。大致流程如下:
- 通信开始的时候使用非对称算法如 RSA,ECDHE先解决密钥交换的问 题
- 用随机数产生对称算法使用的"会话密钥",再用公钥加密。会话密钥很短,所以即便使用非对称加密算法也可以很快完成加解密。
- 对方拿到密文后用私钥解密,取出会话密钥。完成对称密钥的安全交 换,后续就使用对称算法发完成数据交换
数字证书
数字证书组成:CA信息,公钥用户信息,公钥,权威机构的签名,有效期
数字证书作用:
1.通过数字证书向浏览器证明身份
2.数字证书里面包含了公钥
HTTPS执行过程
TCP
特点
- 基于连接的:数据传输之前需要建立连接
- 全双工的:双向传输
- 字节流:不限制数据大小、打包成报文段,保证有序接收、重复报文自动丢弃
- 可靠的传输服务:保证可达、丢包时通过重传实现可靠性
- 拥塞控制:防止网络出现恶性拥塞
TCP结构
TCP连接管理
- TCP连接:四元组[ 源地址, 源端口, 目的地址, 目的端口 ]
- 确立连接:TCP三次握手
三次握手
1) 客户端发送带有SYN标志为1、起始序seq号为随机数x的数据包到服务端 ,客户端进入SYN-SENT状态、
2)服务端发送带有SYN/ACK标志的数据包,其确认字段值ack=x+1,seq=y 包到客户端;服务端进入SYN-RECEIVED状态;客户端接收服务端的ACK包、进入ESTABLISH状态(连接建立完成)
3)客户端发送带有ACK标志的数据包给服务端、其中ack=y+1;服务端进入ESTABLISHED状态(连接建立完成状态)
- 当客户端SYN报文到达时、将SYN包入队到操作系统内核的SYN队列中、服务端为SYN-RECEIVED状态;
- 服务端发送ACK/SYN包给客户端,
- 收到客户端的ACK包后,操作系统内核将SYN中的SYN包出队、再入队到ACCEPT队列、进入ESTABLISH装填。
因此、JavaSocket通信编程中、调用ServerSocket.accept()时、连接处于第三次握手完成状态;
为什么需要三次握手?
为了建立可靠的通信信道,数据的通讯就是数据的发送和接收,而三次握手的主要目的就是双方确认自己和对方的发送和接收是正常的。
第一次握手:客户端发送正常,服务端确认了对方发送正常,自己接收正常。
第二次握手: 客户端确认了:自己发送,接收正常,对方发送,接收正常。Server确认了对方发送正常,自己接收正常。
第三次握手:客户端确认:自己发送,接收正常,对方发送,接收正常;服务端确认:自己发送,接收正常,对方发送,接收正常。
三次握手就能确认双发收发功能都正常,缺一不可。
为什么要传回 SYN
接收端传回发送端所接受的SYN为了告诉发送端,我接受的信息确实就是你发送的信号。
传了 SYN,为啥还要传 ACK
双方通信无误必须是两者相互发送信息都无误。传了SYN,证明发送方到接收方的通道没有问题。
但是接收方到发送方的通道还需要ACK信号来验证。
四次挥手
1)客户端发送一个FIN,用来关闭客户端到服务器端的数据传送;
2)服务器收到FIN,它发回一个ACK,确认序号为收到的序号+1;和SYN一样,一个FIN将占用一个序号;
3)服务器关闭与客户端的连接、发送一个FIN给客户端;
4)客户端受到FIN,发送一个ACK包给服务端,并将序号设为收到序号+1;客户端关闭与服务端的连接。
为什么要四次挥手
任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。
当另一方也没有数据再传送时,则发出连接释放通知,对方确认后,就完全关闭了TCP连接。
为什么等待 2MSL后释放连接
- 防止报文丢失、导致B重复发送FIN;
如果A的响应报文丢失、B端会再次发送、如果不等待就关闭、那么B端连接无法关闭;
- 防止滞留在网络中的报文、对新建立的连接造成数据扰乱;
如果A收到FIN包后就关闭、B端在发送FIN包附近时间点可能也发送其他的数据包、这些数据包延迟了,且A关闭、就会造成B的数据包滞留在网络中。
字节流的协议
TCP把应用交付的数据仅仅看成时一连串的无结构的字节流,TCP并不 知道字节流的含义,TCP并不关心应用程序一次将多大的报文发送到 TCP的缓存中,而是根据对方给出的窗口值和当前网络拥堵的程度来决 定一个报文段应该包含多少个字节。
TCP与UDP的区别
UDP面向无连接的服务。传送数据之前不需要建立连接,远方主机收到UDP报文后,不需要给出确认;支持一对一、一对多,多对多的发送
TCP面向连接的无服。传输数据之前必须先建立连接,数据传输完后,释放连接、只支持一对一的发送
数据可靠性传输
停止等待协议
发送后,等待对方响应ACK报文;
重传机制
如果在一定时间内、没有接受到ACK报文、则认为数据包丢失了。
请求报文丢失
滑动窗口协议与累计确认(延时ack)
滑动窗口大小同通过 tcp三次握手和对端协商,且受网络状况影响
发送后、如果接受到了1、2、4、5的ACK报文、而没有3的ACK报文、则会接下来会发送窗口为:
拥塞控制
了解即可、可略过;
P拥塞控制
为了更好对TCP进行拥塞控制,因特网建议标准定义了以下四种算法:慢开始,拥塞避免,快重传,快恢复。首先在TCP要求发送端维护两个窗口:
1) 接收窗口rwnd,接收方根据当前缓存大小锁许诺的最新窗口值。
2) 拥塞窗口cwnd ,发送方根据自己估算的网络拥塞程度而设置的窗口值。 发送窗口的上限是取这两者的最小值。
慢开始: TCP刚连接好时,先令拥塞窗口cwnd =1 ,在每次收到一个对新报文段的确认时将cwnd加倍. Cwnd的大小呈指数增长。 拥
塞避免算法: 当cwnd大于等于慢开始门限ssthresh时,cwnd窗口每次加1而不是加倍。当发送方检测到超时事件的发生时,就将慢开始门限设置为当前cwnd的一半,同时将cwnd设置为1. 这样的目的是迅速减少主机发送到网络的分组数,使得发生拥塞的路由器有足够的时间吧队列中积压的分组处理完毕。
快重传:当发送方连续收到三个重复的ACK报文时,直接重传对方尚未收到的报文段,而不必等待那个报文段设置的重传计时器超时。
快恢复:当发送端收到连续三个冗余的ACK时,就执行“乘法减小”算法,把慢开始门限ssthresh减半,cwnd设置为慢开始门限减半后的数值(与慢开始不同)。