一些基础概念。
网络模型
- 应用层 Application Layer
- Protocol:HTTP
- 传输层 Transport Layer
- Protocol:TCP/ UDP
- 网络层 Internet Layer
- Protocol:IP
输入url发生什么
- url 解析 parsing
解析并生成HTTP消息 - 发送之前找ip
本地浏览器缓存 -> 本地host ->本地DNS解析器缓存 -> 本地DNSserver
->( - 主域名server,返回
- 顶级域名server,返回
- 根域名server,返回 )
-> 返回本地DNSserver ->返回client - 获取ip后,把 HTTP 的传输工作交给操作系统中的协议栈
include:TCP/ UDP + IP- TCP:三次握手+ 传输报文
TCP 模块在执行连接、收发、断开等各阶段操作时,都需要委托 IP 模块将数据封装成网络包发送给通信对象。
生成IP报文 + MAC包头
- TCP:三次握手+ 传输报文
- 通过网卡,路由器传给server
server逐层去掉头部拿出content,处理数据。返回响应
响应添加头部传给client - client去掉头部,渲染网页
解析html css 构建dom,渲染tree,绘制节点 - TCP4次挥手断开连接
TCP vs UDP
- 连接:
TCP传数据之前要连接,UDP不需要连直接传 - 服务对象:
TCP 一对一,UDP支持一对一,一对多,多对多 - 可靠性:
TCP:可靠。不丢不错按顺序
UDP:可能丢 - 拥塞控制、流量控制
TCP有,保证安全
UDP没有,即使网络很堵,也不影响UDP发送速率 - 首部开销
TCP首部长开销大,还可能变长
UDP首部只有8字节,且固定 - 传输方式
TCP 流式传输,没有边界,保证顺序可靠
UDP 一个包一个包发送,有边界,可能丢包或乱序 - 分片
如果过大TCP在传输层分片,UDP在IP层分片 - 应用场景:
TCP:用于 FTP,HTTP/HTTPS
UDP: 视频音频广播
三次握手 四次挥手
字段
- seq:(sequence number)序号
- ack:(acknowledgement number)确认号
- 标志位:
- SYN: (SYNchronization) 同步
- ACK: (ACKnowlegment) 确认
- FIN: (FINish) 终止
三次握手
- client: SYN=1,seq=x
如果丢失,会重传 - sever: SYN=1,seq=y, ACK=1,ack=x+1
如果丢失,1和2都会重传 - client: eq=x+1, ACK=1, ack=y+1
如果丢失,2会重传
第三次握手可以携带数据,前两次握手不可以携带数据
为什么要三次:
- 可以防止旧的重复连接初始化造成混乱
- 可以同步双方的初始序列号
- 可以避免资源浪费
因为别人给你发了第一条,就表示你可以发数据了,这时可能是旧消息,它来了你就直接发数据这不好吧。
四次挥手
- c: FIN=1,seq=u
- s: seq=v, ACK=1,ack=u+1
- s: FIN=1,seq=w, ACK=1,ack=u+1
- c: seq=u+1, ACK=1,ack=w+1
为什么要四次:
哪一端发fin,表示它不再发送,但它还可以接受。那如果它收到fin,要处理一下自己最后要发送的发送出去。
TIME_WAIT
等待时间是2MSL 相当于至少允许报文丢失一次。
收到fin就会重置计时器。
主动发起的一方才会有。
为什么需要它?
- 防止历史连接中的数据,被后面重新开始的连接错误的接收
这个时长可以让两个方向的数据包都被丢弃 - 保证「被动关闭连接」的一方,能被正确的关闭
如果直接关了,④发的ack又丢了,③就要重传,这时④已经关了,就会异常终止。