特点
- 用户数据报协议 UDP(User Datagram Protocol)是无连接的,尽最大可能交付,没有拥塞控制,面向报文(对于应用程序传下来的报文不合并也不拆分,只是添加 UDP 首部),支持一对一、一对多、多对一和多对多的交互通信。
- 传输控制协议 TCP(Transmission Control Protocol)是面向连接的,提供可靠交付,有流量控制,拥塞控制,提供全双工通信,面向字节流(把应用层传下来的报文看成字节流,把字节流组织成大小不等的数据块),每一条 TCP 连接只能是点对点的(一对一)。
TCP三次握手
-
三次握手
三次握手原因:为了防止失效的连接请求到达服务器,让服务器错误打开连接。
解释:客户端发送的连接请求如果在网络中滞留,那么就会隔很长一段时间才能收到服务器端发回的连接确认。客户端等待一个超时重传时间之后,就会重新请求连接。但是这个滞留的连接请求最后还是会到达服务器,如果不进行三次握手,那么服务器就会打开两个连接。如果有第三次握手,客户端会忽略服务器之后发送的对滞留连接请求的连接确认,不进行第三次握手,因此就不会再次打开连接。 -
四次挥手
四次挥手的原因:为了让服务器端发送还未传送完毕的数据。
解释:客户端发送了 FIN 连接释放报文之后,服务器收到了这个报文,就进入了 CLOSE-WAIT 状态。这个状态是为了让服务器端发送还未传送完毕的数据,传送完毕之后,服务器会发送 FIN 连接释放报文。 挥手中的TIME_WAIT状态
对象:客户端
时期:收到服务器端的 FIN 报文后
动作:等待一个时间计时器设置的时间 2MSL
目的:1. 确保最后一个确认报文能够到达。(如果B服务器没收到A客户端发送来的确认报文,那么就会重新发送连接释放请求报文,A客户端等待一段时间就是为了处理这种情况的发生。)2. 等待一段时间是为了让本连接持续时间内所产生的所有报文都从网络中消失,使得下一个新的连接不会出现旧的连接请求报文。
TCP可靠传输
TCP 使用超时重传来实现可靠传输:如果一个已经发送的报文段在超时时间内没有收到确认,那么就重传这个报文段。超时时间 RTO 略大于 RTTs(加权平均往返时间)。
-
请设计可靠 UDP 协议。(因为速度效率比TCP高)
目前有RUDP、RTP、UDT开源程序利用udp实现了可靠的数据传输。下面是RUDP的思路。
既然原生UDP有那么多痛点,那我能不能像应用层协议一样在UDP数据包头再加一段包头,从而定义为RUDP呢,答案是肯定的。首先思考RUDP需要解决哪些问题,然后根据问题加上必要的包头字段。
1.数据完整性 –> 加上一个16或者32位的CRC验证字段
2.乱序 –> 加上一个数据包序列号SEQ
3.丢包 –> 需要确认和重传机制,就是和Tcp类似的Ack机制
在思考一下既然是自定义协议是不是需要一个协议号字段来过滤一些非法包,那么又可以加入一个新字段:
4.协议字段 –> protol 字段,标识当前使用协议
TCP拥塞控制
TCP 主要通过四个算法来进行拥塞控制:慢开始、拥塞避免、快重传、快恢复。
[图片上传失败...(image-85b4e0-1565764476587)]
web页面请求过程
总体来说分为以下几个过程:
- DNS解析
- TCP连接
- 发送HTTP请求
- 服务器处理请求并返回HTTP报文
- 浏览器解析渲染页面
- 连接结束
DNS 解析过程:
- 浏览器缓存 - 浏览器会缓存 DNS记录一段时间,谷歌浏览器默认是1分钟。
- hosts 文件 - 不同系统放置的目录不一样,Mac 是在 /etc/hosts.
- 路由器缓存
- ISP 解析服务器 - 其实这个是 DNS记录的缓存。
- 递归查询