一. 计算机网络基础
1.网络分层模型
OSI七层模型:
OSI五层模型:应用层、传输层、网络层、数据链路层、物理层。
TCP/IP四层模型:应用层、传输层、网络层、网络接口层。
2.为什么要分层
复杂的系统需要分层,因为每一层都需要专注于一类事情。网络分层的原因也是一样,每一层只专注于做一类事情。
- 各层之间相互独立:各层之间不需要关心其他层是如何实现的,只需要知道自己如何调用下层提供好的功能就可以了(可以简单理解为接口调用)。这个和开发时系统进行分层是一个道理。
- 提高了灵活性和可替换性:每一层都可以使用最适合的技术来实现,只需要保证你提供的功能以及暴露的接口的规则没有改变就行了。并且,每一层都可以根据需要进行修改或替换,而不会影响到整个网络的结构。这个和平时开发系统的时候要求的高内聚、低耦合的原则也是可以对应上的。
- 大问题化小:分层可以将复杂的网络问题分解为许多比较小的、界线比较清晰简单的小问题来处理和解决。这样使得复杂的计算机网络系统变得易于设计,实现和标准化。 平时开发的时候,一般会将系统功能分解,然后将复杂的问题分解为容易理解的更小的问题是相对应的,这些较小的问题具有更好的边界(目标和接口)定义。
3.TCP三次握手与四次挥手
建立连接——三次握手:
- 第一次握手 :客户端发送SYN包(SEQ = x)到服务器,并进入SYN_SENT状态,等待服务器确认。SYN是同步序列编号。
- 第二次握手 :服务器收到SYN包,会确认客户端的SYN(ACK = x+1),同时自己也发送一个SYN包(SEQ = y),即SYN+ACK包,此时服务器进入SYN_RECV状态。
- 第三次握手 :客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ACK = y+1),发送完后,客户端和服务器进入ESTABLISHED状态,完成三次握手。ESTABLISHED状态表示连接建立成功,可以传输数据。
为什么要三次握手?
三次握手的目的是建立可靠的通信信道,双方都确认自己与对方的发送和接收都是正常的。
- 第一次握手:Client 什么都不能确认;Server 确认了对方发送正常,自己接收正常
- 第二次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:对方发送正常,自己接收正常
- 第三次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:自己发送、接收正常,对方发送、接收正常
第二次握手传回了ACK,为什么还要传回SYN?
服务端传回发送端所发送的 ACK 是为了告诉客户端:“我接收到的信息确实就是你所发送的信号了”,这表明从客户端到服务端的通信是正常的。回传 SYN 则是为了建立并确认从服务端到客户端的通信。
如果客户端第一次发送建立连接的SYN,服务端没有收到怎么办?
客户端迟迟收不到服务端的 SYN-ACK 报文(第二次握手),就会触发超时重传机制,重传 SYN 报文,而且重传的 SYN 报文的序列号都是一样的。
当客户端超时重传 3 次 SYN 报文后,由于 tcp_syn_retries 为 3(可设置),已达到最大重传次数,于是再等待一段时间(时间为上一次超时时间的 2 倍),如果还没收到服务端的第二次握手,客户端就会断开连接。
断开连接——四次挥手: