netWork

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

OSI七层网络模型

sevenlayer

TCP/IP 参考模型

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

fivelayer

传输层

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

TCP协议

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

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

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

  • 如何保证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窗口大小信息。
handshake2

  • 客户端先向服务器发送数据,该数据报是长度为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》


槐破梦
148 声望10 粉丝

学习三问:


« 上一篇
前端模块化