文章目录
1.网络分层
2.三次握手四次挥手
三次握手基本原理
SYN:携带这个标志的包正在发起连接请求
FIN:携带这个标志的包正在请求终止连接
下图来自《Wireshark网络分析》"TCP的连接启蒙"部分(左图是wireshark启动relative sequence number的结果)
- 一次握手:客户端发送带有SYN、Seq(序号)标志的数据包->服务端
- 二次握手:服务端发送带有SYN、ACK(前面序号+1)、Seq(序号)标志的数据包->客户端
- 三次握手:客户端发送带有ACK(前面序号+1)标志的数据包->服务端
为什么是三次,两次不行吗
两个也可以,但是不可靠。
假如客户端请求的第一个包跑到一条延迟严重的路径上,迟迟没有到达服务器,客户端就会当这个请求丢失了,会再请求一次,而这次非常顺利的到达了服务器且完成了工作关闭连接。这时,那条延迟的请求到达了,又会建立一次连接,但是这次连接没有任何用处。如果是三次握手的话,客户端收到服务器的回复时,知道这个连接不是它想要的,就发送一个拒绝包,服务器收到后也就放弃了这个连接。
四次挥手基本原理
- 客户端:发送FIN、seq(前面数据的最后序号+1)到服务器,客户端进入FIN-WAIT-1(终止等待1)状态
- 服务器:确认,发送ack(收到的seq+1)、seq,服务器进入CLOSE-WAIT(关闭等待状态)。
- 客户端收到请求后,就进入FIN-WAIT2(终止等待2)状态,等待服务器发送释放报文
- 服务器传输最后的数据
- 服务器:服务器最后的数据发送完毕,关闭连接,发送FIN标志给客户端,服务器进入LAST-ACK(最后确认阶段)
- 客户端:发回ACK确认
3.TCP与UDP的区别
- TCP基于连接,建立连接需要三次握手,断开连接需要四次挥手,UDP不需要连接
- TCP有流量控制和拥塞控制,UDP没有
4.输入一个url之后发生了什么
- DNS解析。浏览器通过DNS查找域名的IP地址(过程:浏览器缓存,路由器缓存,DNS缓存)。
- TCP连接。三次握手。
- 发送HTTP请求。
- 服务器处理请求并返回HTTP报文。
- 浏览器解析渲染页面。
- 连接结束。四次挥手。
使用到的协议:
- DNS:获取域名的IP地址
- TCP:建立TCP连接
- IP:建立TCP协议时,需要发送数据,发送数据在网络层使用IP协议。
- ARP:路由器在与服务器通信时,需要将IP地址转换为MAC地址,使用ARP协议。
- HTTP:TCP建立完成后,使用HTTP协议访问网页。
5.常用状态码
2XX:成功
典型200 OK
3XX:重定向
4XX:客户端错误
典型404 Not Found
5XX:服务器错误
典型500 Internal Server Error
6.滑动窗口
本小节参考《网络是怎样连接的》2.3.5使用窗口有效管理ACK
常见包的传输方式,为一来一回,滑动窗口也就是让包一次传输好多个,加快传输效率。具体就是接受方存在一个接收缓冲区,在开始的时候,先向发送方声明缓冲区的大小,然后发送方开始传输,每次从缓冲区取走数据的时候,更新缓冲区大小告知发送方。为了减少传输,通常把ACK确认和窗口更新合并发送。
6.拥塞控制
本小节参考《Wireshark网络分析》“重传的讲究”。
发送窗口受接收窗口和网络影响,其中限制得更严的因素起决定作用。当发送窗口由接收窗口决定的时候,可以通过"window size:"的值判断。如果由网络问题决定,就变得非常复杂。
网络之所以能限制发送窗口,是因为它一口气收太多数据就会拥塞,导致丢包。这个导致拥塞的数据量称为拥塞点,这个点根据网络的情况,有时堵有时空,是一个动态的值。
发送方会维持一个虚拟的拥塞窗口,使它尽可能接近真实的拥塞点:
- 连接刚刚建立的时候,发送方对网络状态一无所知,发送窗口定的非常小。
- 慢启动过程:如果发出去的包都得到确认,可以增大拥塞窗口(翻倍)。
- 拥塞避免过程:慢启动持续一段时间后,拥塞窗口达到一个较大值,这时每个往返增加一个MSS。如果之前发生过拥塞,就把该拥塞点作为参考;如果没有就取最大接收窗口。
无论怎样,始终还是会达到拥塞点,这个时候就会发生重传,有两种重传方式。
- 超时重传。当发出去的包没有得到确认时,暂停等待,这段时间什么也做不了,如果迟迟收不到,触发重传,这样对传输性能有严重影响,并且触发超时重传后,会重新调整临界窗口值(Richard Stevens在《TCP/IP Illustrated》中定为上次拥塞时发送窗口的一半),接下来的传输也慢多了。
- 快速重传。有时候拥塞很轻微,只有少量的包丢失,后续还有正常包到达。当后续的包到达接收方时,接收方发现其Seq号比期望的大,所以它每收到一个包就Ack一次期望的Seq号,以此提醒发送方重传。当发送方收到3个或以上重复确认时,就意识到相应的包丢失了,立刻重传它。快速重传不像超时重传需要等待一段时间,并且临界窗口值也没必要调整,接下来传慢一点就可以了。
为什么是三个及以上,因为网络包有时候会轻微乱序,为了乱序完全没有重传的必要。
相比之下,超时重传对性能影响最大,应尽量避免超时重传。
7.TCP如何保证可靠传输
- 序列号与确认应答(Seq与ack)
- 超时重传与快速重传
- 连接管理(三次握手四次挥手)
- 流量控制(通过滑动窗口机制,使接受窗口控制发送窗口)
- 拥塞控制(拥塞窗口控制发送窗口)
8.cookie
HTTP是无状态协议,不对之前的请求和响应状态进行管理,这就意味着,要求登录认证的web页面每次跳转都会重新登录,cookie正是用于解决这类问题而存在的,
cookie技术通过在请求和响应报文中写入cookie的信息来控制客户端的状态,cookie会根据从服务器端发送的响应报文内的一个叫做set-cookie的首部字段信息,通知客户端保存cookie。当下次客户端再往服务器发送请求时,客户端会自动在请求报文中加入cookie值后发送出去。服务端发现客户端发送过来的cookie后,会去检查究竟是从哪一个客户端发来的连接请求,然后对比服务器上的记录,得到之前的状态信息。
图片来自《图解HTTP》
9.HTTPS
采用混合加密方式,在交换密匙环节使用公开密匙加密,之后的建立通信交换报文阶段则使用共享密匙加密方式。由于无法确定公开密匙是否来自目标,所以引入了数字认证机构(CA)。
首先服务器要向数字认证机构申请公匙证书,数字认证机构判明服务器的身份后,用自己的私有密匙部署数字签名并颁发公匙证书,连接的时候,服务器向客户端发送公匙证书,客户端拿到后,用数字认证机构的公开密匙解密数字签名,确认真实性,然后再使用服务器的公开密匙对报文(共享密匙)加密传输,服务器再用私有密匙对报文解密。之后的传输,都依靠共享密匙就行了。
与HTTP的区别
- HTTPS默认端口443,HTTP默认使用端口80。
- HTTP运行在TCP之上,所有传输的内容都是明文,客户端和服务端都无法验证对方身份。HTTPS是运行在SSL/TLS之上的HTTP协议,SSL/TLS运行在TCP之上,所有传输内容都经过加密-混合加密。