1.进程和进程之间通信
2. TCP
面向连接 可靠 (序号 选择重传) 报文格式
2.1 功能
差错控制 流量控制 拥塞控制
2.2 建立和释放连接
2.2.1 三次握手
ack seq小写代表序号 ACK 是确认 除了第一次没有下面都有 是0或1 SYN=1一个连接请求或连接接受
seq: TCP发送序号
--> SYN=1 seq=x
<-- SYN=1 ACK=1, seq=y ack=x+1 (ack=seq+1 指的是上一个客户端的序号+1)
--> ACK=1 seq=x+1 ,ack=y+1
为啥三次不是两次?
如客户端发出连接请求,但因连接请求报文丢失而未收到确认,于是客户端再重传一次连接请求。
后来收到了确认,建立了连接。数据传输完毕后,就释放了连接,
客户端共发出了两个连接请求报文段,其中第一个丢失,第二个到达了服务端,
但是第一个丢失的报文段只是在某些网络结点长时间滞留了,
延误到连接释放以后的某个时间才到达服务端,
此时服务端误认为客户端又发出一次新的连接请求,于是就向客户端发出确认报文段
同意建立连接,不采用三次握手,只要服务端发出确认,
就建立新的连接了,此时客户端忽略服务端发来的确认,
也不发送数据,则服务端一致等待客户端发送数据,浪费资源。
2.2.2 四次挥手
客户端 服务器
--> FIN=1 seq=u
<-- ACK=1 seq=v ack=u+1
<-- ACK=1 seq=w ack=u+1
<-- ACK=1 seq=u+1 ack=w+1
浏览器先判断是否为合法的url格式,不合法则在搜索引擎中搜索
合法后,DNS解析会先判断缓存中是否有url的ip地址。
缓存的查询顺序是:浏览器缓存 -> 操作系统缓存(本地的hosts文件) -> 路由器缓存 -> 本地的DNS服务器缓存
在缓存中没有的情况,则向服务器发起请求查询ip地址。
查询IP地址的顺序是:根域名服务器 -> 顶级域名服务器 -> 权威域名服务器。直到查找到返回,并将其存储在缓存中下次使用
TCP建立连接,也就是三次握手
第一次握手,携带建立连接请求SYN=1和随机序列seq=x
第二次握手,携带确定字段ACK=1、连接请求SYN=1、随机序列seq=y和ack为上一次握手的seq+1,就是x+1
第三次握手,携带确定字段ACK=1、ack=y+1、seq=x+1
如果是https,还有一个TLS四次握手
第一次握手,客户端向服务端发送 支持的协议版本 + 支持的加密方法 + 生成的随机数
第二次握手,服务端向客户端发送 证书 + 公钥 + 随机数
第三次握手前,客户端会先验证证书有没有过期、域名对不对、是否可信机构颁发的。
没有问题或者用户接受不受信的证书,浏览器会生成一个新的随机数
第三次握手,将之前的三个随机数通过一定的算法生成会话秘钥,之后的加密解密都是用这个秘钥
第四次握手,服务端收到回复,是用确定的加密方法进行解密,得到第三个随机数,使用同样的算法计算出会话秘钥
建立连接之后,浏览器发送http请求
请求报文由请求行、请求头、空行和请求体组成
服务器解析请求报文,返回响应报文
响应报文由响应行、响应头、空行和响应体组成,我们需要的html文件就在响应体中
浏览器拿到html文件并开始解析,构建dom tree。遇到css文件,下载并构建CSSOM tree。等到两者都构建完成之后,一起构建Render tree。然后进行布局和绘制
其中遇到了script标签,则停止构建dom tree,等下载完成之后才会继续构建dom tree
当资源传输完毕之后,TSP关闭连接,进行四次挥手的操作, 其中四次挥手的操作客户端和服务器都可以发起
第一次挥手,携带断开连接的FIN=1、确定字段ACK=1、随机序列seq=u,ack=v
第二次挥手,携带确定字段ACK=1、随机序列seq=v,ack=u+1
第三次挥手,携带确定字段ACK=1、断开连接FIN=1、随机序列seq=w、ack=u+1
第四次挥手,携带确定字段ACK=1,随机序列seq=u+1,ack=w+1
等待2MSL后进入关闭状态
断开连接,结束通讯