本文内容基于《计算机网络》第6版,谢希仁著。
5.1.1 为什么机器在处理IP数据报时要使用IP地址而不是域名?
0. 计算机网络体系结构
1. 物理层
2. 数据链路层
3. 网络层
4. 传输层
4.1 UDP
4.1.1 UDP的特点
- UDP是无连接的;
- UDP尽最大努力交付,即不保证可靠交付;
- UDP是面向报文的,即UDP对应用层交下来的报文在添加首部后就向下交付IP层;
- UDP没有拥塞控制,即网络出现拥塞不会使得发送速率降低;
- UDP支持一对一、一对多、多对一和多对多的交互通信;
- UDP的首部开销小,只有8个字节。
4.2 TCP
4.2.1 TCP的特点
- TCP是面向连接的;
- TCP提供可靠交付,即无差错、不丢失、不重复并且按序到达;
- TCP是面向字节流的,即TCP把应用层交下来的报文看成是一连串的无结构的字节流,把一定量的字节加上首部后就形成了报文段然后向下交付IP层;
- TCP有拥塞控制,TCP根据对方给出的窗口大小和当前网络拥塞的程度来决定一个报文段应该包含多少字节,并且TCP提供全双工通信;
- TCP只能是一对一的通信;
- TCP首部开销比UDP大,有20个字节。
4.2.2 TCP三次握手
- 服务器处于LISTEN状态,等待客户端的连接请求;
- 客户端向服务器发出连接请求报文段,其中同步位SYN=1,初始序号seq=x,客户端进入SYN_SENT状态;
- 服务器接收到连接请求报文段之后,向客户端发送连接确认报文段,其中同步位SYN=1,确认位ACK=1,确认号ack=x+1,初始序号seq=y,服务器进入SYN_RCVD状态;
- 客户端接收到连接确认报文段之后,向服务器发送确认报文段,其中确认位ACK=1,确认号ack=y+1,序号seq=x+1,客户端进入ESTABLISHED状态;
- 服务器接收到确认报文段之后,进入ESTABLISHED状态;
- TCP连接建立。
【注】
- 当同步位SYN=1且确认位ACK=0时,表示这是一个连接请求报文段;当同步位SYN=1且确认位ACK=1时,表示这是一个连接确认报文段。
- 确认号的意思是“如果你发给我的序号是x,我发给你的确认号就是x+1,表示到序号x我已经收到了,我希望你下次发给我的序号是x+1”。
- 确认报文段,即ACK报文段,如果没有携带数据,是不消耗序号的。
为什么需要三次握手?
- 信息对等
客户端和服务器都需要确认4类信息:自己的发报能力、自己的收报能力、对方的发报能力、对方的收报能力,才能建立连接。
第一次握手后,服务器能确认自己的收报能力和对方的发报能力;
第二次握手后,客户端能确认自己的发报能力、自己的收报能力、对方的发报能力和对方的收报能力;
第三次握手后,服务器能确认自己的发报能力和对方的收报能力。
- 防止超时
报文的生存时间往往都会超过TCP请求超时时间。
如果两次握手就可以创建连接,传输数据并释放连接后,第一个超时的连接请求才到达服务器的话,服务器会以为是客户端创建新连接的请求,然后确认同意创建连接,但是这时候客户端的状态不是SYN_SENT,就直接丢弃服务器的确认数据,导致服务器单方面创建连接完毕。
如果是三次握手,则服务器收到连接请求后,同样会向客户端确认同意创建连接,但因为客户端不是SYN_SENT状态,所以会直接丢弃,服务器由于长时间没有收到确认信息,最终超时导致创建失败,因而不会出现脏连接。
4.2.3 TCP四次挥手
- 客户端和服务器都处于ESTABLISHED状态,双方都可以释放连接;
- 客户端向服务器发送连接释放报文段,其中终止位FIN=1,序号seq=u,客户端进入FIN_WAIT_1状态;
- 服务器接收到连接释放报文段之后,向客户端发送确认报文段,其中确认位ACK=1,确认号ack=u+1,序号seq=v,服务器进入CLOSE_WAIT状态;
- 客户端接收到确认报文段之后,进入FIN_WAIT_2状态,等待服务器发送连接释放报文段;
注意,此时客户端不再向服务器发送数据了,但是服务器可能还需要向客户端发送数据。
- 如果服务器不需要向客户端发送数据了,就向客户端发送连接释放报文段,其中终止位FIN=1,确认位ACK=1,确认号ack=u+1,序号seq=w(不是v+1是因为上面又发送了一些数据),服务器进入LAST_ACK状态;
- 客户端接收到连接释放报文段之后,向服务器发送确认报文段,其中确认位ACK=1,确认号ack=w+1,序号seq=u+1,客户端进入TIME_WAIT状态;
注意,此时TCP连接还没有释放掉,客户端要等待2MSL才自动进入CLOSED状态,这是因为:第一,客户端上一步向服务器发送的确认报文段可能会丢失;第二,让这一次TCP连接中的报文段都从网络中消失,不会影响下一次TCP连接。
- 服务器接收到确认报文段之后,进入CLOSED状态;
- TCP连接释放。
5. 应用层
5.1 DNS
5.1.1 为什么机器在处理IP数据报时要使用IP地址而不是域名?
这是因为IP地址的长度是固定的32位,IPv6是128位,而域名的长度并不是固定的,机器处理起来比较困难。
5.1.2 DNS域名的解析过程?
首先要了解域名:
然后要了解DNS的域名服务器:
DNS域名解析过程(某个主机想要知道另外一个主机的IP地址):
本地域名服务器采取迭代查询:
- 某个主机向本地域名服务器进行递归查询(UDP减少开销);
- 本地域名服务器向根域名服务器进行迭代查询;
- 根域名服务器判断顶级域名,然后告诉本地域名服务器,去查询对应的顶级域名服务器;
- 本地域名服务器向顶级域名服务器进行迭代查询;
- 顶级域名服务器判断二级域名,然后告诉本地域名服务器,去查询对应的权限域名服务器;
- 本地域名服务器向权限域名服务器进行迭代查询;
- 权限域名服务器告诉本地域名服务器所查询的主机的IP地址;