为什么要实现网络分层?
1.各层之间相互独立:类似于JAVA中的接口一样,各层之间只需要关注自己如何调用下层提供好的功能,不必在乎下层的实现,这个和我们对开发时系统进行分层是一个道理。
2.灵活性好:各层都可以采用最适当的技术来实现,整体架构不会因为某一层的技术变动产生影响,也对应了高内聚、低耦合的原则。
3.大问题化小 :分层设计有助于我们把一些大的、复杂的网络问题拆分成一些小的、简单的问题来处理,这样使得复杂的计算机网络系统变得易于实现和标准化。
OSI(Open System Interconnect)网络7层模型是ISO组织定义的一个计算机互联的标准分层模型,而我们平时使用的大多都是TCP/IP模型是OSI七层网络模型的简化版:
应用层协议负责定义应用进程间的通信和交互的规则,常见的应用层协议有:
超文本传输协议:HTTP、HTTPS;
电子邮件协议:SMTP、POP3;
域名解析协议:DNS;
文件传输协议:FTP;
传输层协议负责定义两台主机进程之间的通信,常见的传输层协议有:
面向连接的、可靠性高的TCP协议;(传输控制协议)
传输效率快,无需连接的UDP协议;(用户数据报协议)
TCP协议通过三次握手来建立客户端与服务器之间的TCP连接:
第一次握手:客户端向服务器发送一个TCP数据包,其中TCP首部标志位为SYN=1,ACK=0表示这是一次请求连接的数据包;
第二次握手:服务器根据SYN=1,ACK=0,判断出这是一个请求连接,若同意连接,则会恢复一个首部标志位为SYN=1,ACK=1的数据包表示同意连接;
第三次握手:客户端收到服务器的确认后,再给服务器发送一个首部标志位为ACK=1的数据包,代表双方均已同意创建连接,此时连接正式创建成功,双方都进入ESTABLISHED就绪状态。
三次握手在建立连接时,传递序号和确认号是为了确保数据在传输过程中的可靠性和完整性,同时得到一个可靠的初始化序号seq,为正式的数据传输做准备。
在连接过程中的前两次握手中,第一次握手是客户端向服务器发出建立连接的请求,第二次握手是服务器跟客户端确认了这个请求,这两次握手已经足以证明服务器与客户端之间的网络是通畅的。
但是如果没有第三次握手,如果客户端第一次向服务器发起连接请求时,因为网络的原因这次请求超出了客户端设置的超时时间RTO之后还没到达服务器,客户端没有收到确认信息,就发起了第二次连接请求,这一次请求很快就到达了服务器端,服务器也立即给出了确认信息。如果此时刚好第一个请求到达服务器,服务器会当作一个新的请求连接来出气,会发出一个确认信息给客服端,但是客户端此时不会处理这个请求,而服务器会一直无效等待,会消耗一定的资源,如果这种操作过于频繁也会导致服务器压力过大而宕机。
因此,三次握手是为了避免重复连接,防止旧连接引发的连接混乱问题。
此外,通过三次握手还可以得到一个可靠的初始化序号seq,用于进行接下来的可靠性传输,两次握手无法初始化一个可靠的序号。
综上,两次既不稳定,也无法得到稳定的序号,四次没必要,浪费资源。三次刚刚好。
TCP协议通过四次挥手来释放客户端与服务器之间的TCP连接:
第一次挥手:客户端向服务器发起连接释放的请求数据包,并停止发送数据。
TCP首部标志位信息:FIN=1,ACK=0;
第二次挥手:服务器收到客户端发送的连接释放的数据包,给客户端发送确认报文。此时TCP连接处于版关闭状态,客户端无法给服务器发送数据,但服务器还可以给客户端发,客户端还能接受。
TCP首部标志位信息:FIN=0,ACK=1;
第三次挥手:服务器此时已经没有数据发送给客户端了,开始第二次释放连接:
TCP首部标志位信息:FIN=1,ACK=1;
第四次挥手:客户端收到服务器发来的连接释放请求的数据包后,向服务器发送确认信息:
TCP首部标志位信息:FIN=0,ACK=1;
至此,通过四次挥手,连接释放成功。
流量控制就是为了控制发送方发发送速率,保证接收方来得及接受。
TCP使用的流量控制协议时可变大小的滑动窗口协议。通过滑动窗口实现流量控制。
TCP连接中的发送方和接收方都有一块缓冲空间,接收方只允许发送方发送接收缓冲区可以容纳的数据,当接收方来不及处理发送方的数据时,就会提示发送方降低发送速率,防止丢包,从而实现流量控制;
接收方可以通过数据包首部中的窗口字段指定下次发送方能发送的数据大小,从而影响发送速率。
滑动窗口是实现流量控制的一种机制。
滑动窗口是TCP协议用于实现流量控制的一种机制。发送方和接收方分别维护各自的缓冲区,这个缓冲区就是窗口。发送方的窗口大小由接收方的TCP首部的窗口字段决定。发送方将窗口内容分为:已发送并确认,已发送未确认,未发送未超出接收方窗口范围,未发送但超出接收方窗口范围。随着接收方的确认,发送方将不断在窗口内向前滑动。
接收方将窗口内容分为:接受已确认,未收到但可以接受。接收方读取窗口内容,并不断确认通知发送方,窗口向前滑动。接收方通过改变窗口大小,可以控制发送方的速率,从而实现流量控制。
这里其实是有一个误区的,我看了很多教材上说的都是:
TCP发送方的窗口=MIN[拥塞窗口,接受窗口],为了方便滑动窗口的理解,就先以接受窗口的方式理解。
发送方需要维护一个叫做拥塞窗口(cwnd)的状态变量,来决定发送方可以同时发送多少数据包。数据包的数量多与少,将决定网络中产生拥塞的可能性大与小。TCP主要通过四个算法来进行拥塞控制:慢开始、拥塞避免、快重传、快恢复。
1.TCP协议需要建立连接,仅支持一对一通信;UDP协议无需建立连接,支持一对一、一对多、多对一和多对多的交互通信。
2.TCP是面向字节流的传输层协议,而UDP是直接将数据报文原封不动的打包发送,是面向报文的传输层协议。
2.TCP协议通过确认应答、连接管理、流量控制、拥塞控制来确保可靠性传输;UDP不保证可靠性传输。
3. 性能效率:TCP协议传输效率慢,需要较多的资源开销。UDP协议传输效率快,需要较少的资源开销。
4.首部格式:TCP协议的首部需要20-60个字节,UDP协议需要8个字节。