网络体系结构
相关概念
在分析分层之前需要知道一些概念:
-
报文:格式化的消息;
-
分组:将长报文分成更小的数据块;
-
分组传输时间:L比特的报文 / R比特每秒的传输速率;
-
分组交换机:路由器或链路层交换机,通过存储转发,需要接收整个分组放在输出队列中,然后才能转发,因此有转发时延;
-
丢包:当一个新的分组进来,发现输出队列已满,则需要选择该分组或队列中的分组丢掉;
-
协议:定义通信实体之间的报文交换的格式、次序,以及发送报文、接收报文或其它事情的操作;
-
协议栈:各层所有的协议被称为协议栈 ;
Inter协议栈(5层)
-
应用层:应用程序和协议,协议如:HTTP,消息分组称为报文;
-
传输层:应用程序端点之间的传递,协议如:TCP,传输层分组称为报文段,向网络层提交报文和目标地址;
-
网络层:从一台主机传递到另一台主机,协议如:IP协议,网络层分组称为数据报;
-
链路层:网络层下传至链路层,链路层从一个结点(主机或分组交换机)传递到另外一个结点,链路层分组称为帧;
-
物理层:将帧一个个比特传递到下一个结点;
OSI模型(7层)
OSI模型比Inter协议栈多个两层:表示层、会话层
-
表示层:对通信数据的解释,例如:数据压缩、数据加密、数据描述(使应用程序不再关心各个计算机之间表示和内部存储格式不一样。)
-
会话层:对数据交换定界和同步功能,例如:不同软件的数据分发给不同的软件。
表示与会话层由应用程序开发者处理。
TCP/IP分层(4层)
分为应用层、传输层、网络层、网络接口层(也称链路层)。
三个体系结构之间的关系:
TCP协议
TCP协议位于传输层。两应用程序间传输数据需要建立连接,TCP通过三次握手建立连接,是确保传输可靠的方式之一;
三次握手建连
简单理解由于TCP是双工通信,因此会建立从发送端到接收端 与 接收端到发送端的连接,通过SYN申请建立连接,被申请方如果同意建立连接,则会返回一个ACK,接收端会将SYN和ACK一起返回,如此一来就构成了三次握手建连。
为了方便理解图中将发送端标为Client,接收端标为Server,三次握手的具体过程如下:
-
接收端此时在监听端口,所以在建立连接前接收端处于LISTEN状态。发送端准备建立连接,会向接收端发送SYN同步包,发送完后发送端处于SYN_SET状态。
-
接收端在接收到SYN同步包后,同意建立连接,会向发送端返回ACK(回复SYN请求)、SYN,并将状态设置为SYN_RCVD;由于TCP是双工通信,所以接收端会向发送端发送SYN,建立从接收端到发送端的通信。
-
发送端接收到ACK后,连接状态变为了ESTABLISED状态,为了回复接收端的SYN请求,会向接收端发送ACK;接收端,接收到ACK后,状态变为ESTABLISHED,此时连接就建立起来了。
SYN攻击就是通过向接收端发送大量的SYN,从而导致接收端大量的连接处于SYN_RECVD状态,影响其它正常的连接。
四次挥手断连
发起断连的可以是双方中的任意一方,四次挥手断连可以简单理解为断开 发送端(将发起断连的一方称为发送端)和接收端的连接 与 接收端与发送端的连接,由于发起断连的一方并不知道另外一方是否还有数据传输,所以会将对FIN的回复的ACK和断连请求FIN分开发,于是就成了四次挥手断连。
将发起断连的一端称为发送端,另外一端称为接收端,具体过程如下:
-
发送端和接收端断连之前都属于ESTABLISHED状态;但发送端数据传输完成之后,向接收端发送FIN,表示要断开连接,连接状态变为FIN_WAIT_1。
-
接收端接收到FIN后,会回复ACK,状态变为CLOSE_WAIT;发送端接收到ACK后,连接状态变为FIN_WAIT_2,此时处于半关闭状态,接收端发送端依然可以传输数据;
-
当接收端不再传输数据时,向发送端发送FIN,此时状态为LAST_ACK,等待接收端应答就可以关闭了;
-
发送端接收到FIN后,状态变为TIME_WAIT,并向回复ACK,在等待2倍最大报文生存时间后,状态变为CLOSED;接收端接收到ACK后,状态变为CLOSED,此时连接关闭。
发送端需要等待2倍最大报文的生存时间的原因有两点:
-
保证连接能够可靠关闭;
-
等待重复数据从网络中消失,防止端口重用时出现数据混淆;
TCP协议的特点
TCP是可靠性传输,具有以下几个特点:
-
TCP的传输是基于字节流的,按照字节进行编号,然后通过ACK来确认收到的数据编号,这样能够保证数据的有序性和完整性;
-
TCP能够流量控制,通过滑动窗口控制传输速率。滑动窗口的本质是动态缓冲区,接收端根据自己的能力,通过ACK发送给发送端,发送端根据窗口大小来控制发送速率;
-
TCP还提供拥塞控制,用于解决大量重传导致的网络情况恶化。主要用到了慢启动、拥塞避免、拥塞发生、快速恢复四个算法;
状态码
状态码指的是客户端向服务器发送请求时,描述服务器返回的结果,由3位数字和原因短语组成;
数字 | 原因 | 具体 |
1XX | 表示请求正在处理 | ------- |
2XX | 请求已经成功处理 | 200 Ok 204 No Content 206 Partial Content |
3XX | 重定向 | 301 Moved Permanently 302 Found(临时重定向) |
4XX | 服务器无法处理请求 | 400 Bad Request 401 Unauthorized 第一次返回需要验证,第二次返回验证出错 403 Forbidden 404 Not Found |
5XX | 处理请求出错 | 500 Internal Server Error 503 Service Unavailable |