netWork

73次阅读

共计 2093 个字符,预计需要花费 6 分钟才能阅读完成。

netWork

OSI 是 Open System Interconnection 的缩写,意为开放式系统互联。国际标准化组织(ISO)制定了 OSI 模型,该模型定义了不同计算机互联的标准,是设计和描述计算机网络通信的基本框架。OSI 模型把网络通信的工作分为 7 层,分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。首先来看看 OSI 的七层模型:

OSI 七层网络模型

TCP/IP 参考模型

TCP/IP 是传输控制协议 / 网络互联协议的简称。早期的 TCP/IP 模型是一个四层结构,从下往上依次是网络接口层、互联网层、传输层和应用层。后来在使用过程中,借鉴 OSI 七层参考模型,将网络接口层划分为了物理层和数据链路层,形成五层结构。

传输层

传输层是面向连接的、可靠的的进程到进程通信的协议。TCP 提供全双工服务,即数据可在同一时间双向传播。TCP 将若干个字节构成一个分组,此分组称为报文段 (Segment)。提供了一种端到端的连接。传输层的协议主要是 TCP,TCP(Transimision Control Protocal) 是一种可靠的、面向连接的协议,传输效率低。

TCP 协议

http 协议其实就是 TCP 链接和一些使用链接得规则。
TCP 提供了可靠得比特传输管道
ip 分组承载了 tcp 片段,每个 ip 分组都包括:

  • 一个 ip 分组首部
  • 一个 tcp 段首部
  • 一个 tcp 数据块

ip 首部包含了来源和目的地 ip 地址,长度和其他得一些标记。
TCP 段首部包含了 TCP 端口号、tcp 控制标记、以及用于数据排序和完整性检查得一些数字值

  • 如何保证 TCP 链接得正确性

通过 < 源 ip 地址、源端口号、目的 ip 地址、目的端口号 > 保证了唯一性

  • 验证数据是否接收到

    1. 32 位序列号 TCP 用序列号对数据包进行标记,以便在到达目的地后重新重装,假设当前的序列号为 s,发送数据长度为 l,则下次发送数据时的序列号为 s + l。在建立连接时通常由计算机生成一个随机数作为序列号的初始值
    2. 确认应答号 它等于下一次应该接收到的数据的序列号。假设发送端的序列号为 s,发送数据的长度为 l,那么接收端返回的确认应答号也是 s + l。发送端接收到这个确认应答后,可以认为这个位置以前所有的数据都已被正常接收。
  • 控制位 TCP 的连接、传输和断开都受这六个控制位的指挥

    1. PSH(push 急迫位) 缓存区将满,立刻传输速度
    2. RST(reset 重置位) 连接断了重新连接
    3. URG(urgent 紧急位) 紧急信号
    4. ACK(acknowledgement 确认)为 1 表示确认号
    5. SYN(synchronous 建立联机) 同步序号位 TCP 建立连接时要将这个值设为 1
    6. FIN 发送端完成位,提出断开连接的一方把 FIN 置为 1 表示要断开连接

三次握手

TCP 是面向连接的,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。在 TCP/IP 协议中,TCP 协议提供可靠的连接服务,连接是通过三次握手进行初始化的。三次握手的目的是同步连接双方的序列号和确认号 并交换 TCP 窗口大小信息。

  • 客户端先向服务器发送数据,该数据报是长度为 159 的数据。
  • 服务器收到报文后, 也向客户端发送了一个数据进行确认(ACK),并且返回客户端要请求的数据,数据的长度为 111,将 seq 设置为 1,ack 设置为 160(1 + 159)。
  • 客户端收到服务器返回的数据后进行确认(ACK),将 seq 设置为 160,ack 设置为 112(1 + 111)。
为什么不能两次:

当客户端想要建立连接时发送一个 SYN,然后等待 ACK,结果这个 SYN 因为网络问题没有及时到达 B,所以客户端在一段时间内没收到 ACK 后,在发送一个 SYN,服务器也成功收到,然后客户端也收到 ACK,这时客户端发送的第一个 SYN 终于到了服务器,对于服务器来说这是一个新连接请求,然后服务器又为这个连接申请资源,返回 ACK,然而这个 SYN 是个无效的请求,客户端收到这个 SYN 的 ACK 后也并不会理会它,而服务器却不知道,服务器会一直为这个连接维持着资源,造成资源的浪费

四次挥手

  • 第一次挥手:客户端向服务器发送一个 FIN 报文段,将设置 seq 为 160 和 ack 为 112,; 此时,客户端进入 FIN_WAIT_1 状态, 这表示客户端没有数据要发送服务器了,请求关闭连接;
  • 第二次挥手:服务器收到了客户端发送的 FIN 报文段,向客户端回一个 ACK 报文段,ack 设置为 1,seq 设置为 112; 服务器进入了 CLOSE_WAIT 状态,客户端收到服务器返回的 ACK 报文后,进入 FIN_WAIT_2 状态;
  • 第三次挥手:服务器会观察自己是否还有数据没有发送给客户端,如果有,先把数据发送给客户端,再发送 FIN 报文;如果没有,那么服务器直接发送 FIN 报文给客户端。请求关闭连接,同时服务器进入 LAST_ACK 状态;
  • 第四次挥手:客户端收到服务器发送的 FIN 报文段,向服务器发送 ACK 报文段,将 seq 设置为 161,将 ack 设置为 113,然后客户端进入 TIME_WAIT 状态; 服务器收到客户端的 ACK 报文段以后,就关闭连接; 此时,客户端等待 2MSL 后依然没有收到回复,则证明 Server 端已正常关闭,客户端也可以关闭连接了。

参考资料

珠峰培训
《http 权威指南》
《图解 http》

正文完
 0