暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

OSI模型与TCP/IP

若安知鱼之乐 2020-09-18
571

发点:运维的时候,经常会遇到连接超时的情况,为了更好的明白程序在处理请求动作开始前和结束的动作,从这里整理下网络的一些基本知识。

【知识巩固】

1、什么是OSI模型?

OSI(Open System Interconnection)定义了一个用七层的网络架构实现网络通信的协议,是一种网络架构设计参考概念模型。如下图:

2、了解OSI模型的七层的功能
No
Model Layer
Funcatation
1

物理层

Physical, 单位为Bit

规范有关传输媒介的特性标准,负责将信息编码成电流脉冲。
2

数据链路层
Data link, 单位frame

数据链路层在不可靠的物理介质上提供可靠的数据传输。该层的作用:物理地址寻址、数据的成帧、流量控制、数据的检错和重发。
该层对接收到的物理层传输过来的比特流进行分组,一组电信号构成的数据包,就叫做“帧”,被称为帧的数据报包含帧头和帧数据,其中帧头包括接收方物理地址和其他的网络信息,帧数据就是要传送的数据。
3

网络层
Network,单位datagram

数据端对端的传输建立逻辑链路,并将数据链路层提供的帧数据加工为数据包,建立合适的路由分发协议和地址解析协议(ARP)。网络层还可以实现拥塞控制、网际互连等功能。
4

传输层
Transport

建立连接,提供可靠的端到端的网络数据流服务(Port端口),功能包括是否选择差错恢复协议还是无差错恢复协议,以及对收到的顺序不对的数据包进行排序,
5

会话层
Session

定义了如果开始、控制和结束一个会话,包括对多个双向消息的控制和管理,会话层管理主机之间的会话进程,及负责建立、管理、终止进程之间的会话,还会利用在数据中插入校验点来实现数据的同步。
6

表示层
Presentation

这一层的主要功能是根据需要的协议对数据进行格式定义和数据加密、压缩、格式转换等。
7

应用层
Application

应用层为模型中的最顶层,为应用程序提供服务并规定应用程序中通信相关的细节或称为网络服务的接口。

3、数据封包过程

如下图:
 

封包说明:
应用层发送消息
segment
表示层
消息类型 TEXT
packet
会话层
建立会话
frame

传输层

报文消息头 PORT

网络层IP地址的报文消息头 IP

链路层添加一个以太信息 MAC

物理层网卡 电信号

TCP报文的头部结构

字段介绍:

1)序号:sequence number,用来标识从TCP源端向目的端发送的字节流,发送方发送数据时对此标记。
2)确认序号:ack序号,只有ack标志位为1时,确认需要字段才有效,ack=seq+1。
3)标志位:共6个,
  • ACK:确认序号有效

  • FIN:释放一个连接

  • PSH:接收方应该尽快将这个报文交给应用程序

  • RST:重置连接

  • SYN:发起一个新的连接

  • URG:紧急指针(urgent pointer)有效

【TCP/IP协议】
OSI模型只是一种参考概念模型,网络上比较通用的有TCP/IP模型(五层),TCP/IP网络通信协议(四层)。OSI模型的提出是参考TCP/IP模型抽象提出的一种概念模型。

1、TCP/IP模型

应用层
为应用提供网络服务,具体的信息展示
传输层
TCP/UDP协议,PORT
网络层
IP地址
数据链路层MAC,多路访问控制
物理层
传送介质
2、TCP/IP的三次握手
三次握手就是为了建立一个TCP连接前,确认发送方和接收方功能是否正常,在客户端执行connect()时触发。具体过程如下:

说明:

  1. 客户端(Client)和服务端(Server)开始状态为CLOSED、LISTENED;

  2. 第一次握手:Client发送给Server一个SYN(synchronous)报文并指明客户端的初始化序列号为ISN@(seq,随机产生X),此时Client状态变为SYN_SENT;

    Source portDestination port
    Sequence number=X
    Acknowledgment number(if ACK set)
    Data 
    offset

    U

    R

    G

    AC

    K

    P

    S

    H

    RST

    1

    F
    I
    N
    Windows
    checksumUrgent point(if URG set)
    Any options
    user data
  3. Server接收到Client发送的报文后,会发送要给ACK(Acknowledgement)报文给Client,将自己的SYN作为应答,并指明自己的初始化序列号ISN(sequence)。同时把Client传来的x+1作为ack值,表示已经收到了Client的SYN报文,此时Server状态为SYN_REVD的状态。

    Source portDestination port
    Sequence number=Y
    Acknowledgment number(if ACK set)=X+1
    Data 
    offset

    U

    R

    G

    1

    P

    S

    H

    RST

    1

    F
    I
    N
    Windows
    checksumUrgent point(if URG set)
    Any options
    user data
  4. 第三次握手:Client接收到Server返回的报文,会再次发送一个ACK响应报文,一样把seq值加1作为ack值,表示已经接收到了Server的SYN报文,此时Client处于ESTABLISHED状态,Server接收到报文后,状态变更为ESTABLISHED。

    Source portDestination port
    Sequence number
    Acknowledgment number(if ACK set)=Y+1
    Data 
    offset

    U

    R

    G

    1

    P

    S

    H

    RST

    SYN

    F
    I
    N
    Windows
    checksumUrgent point(if URG set)
    Any options
    user data(X+1)

至此TCP三次握手结束,连接建立后数据开始传输。

异常情况:

    1)client第一个SYN包丢失,没有收到Server的ACK,则Client进行持续重传SYN包,总尝试时间为75秒。

    2)Server包收到了clent的SYN包,并发出SYN+ACK包,SYN+ACK包丢失。
          client:因为没有收到server的ACK,将执行1);

          server:超时时间内没有收到client的ACK包,将再次发送SYN+ACK包;

    3)当Client接收到Server响应的SYN+ACK后,其状态变为ESTABLISHED,并发送ACK包给Server。

          ①若ACK包在网络中丢失,那么Server的状态依然为SYN_REVD,在等待3、6、12秒后依然会执行发送SYN、ACK包给Client,重发次数为5次。如果在5次尝试内并未建立连接,则server自动关闭该连接,如果在重发过程中收到了Client的带有数据的ACK报文,连接也能建立。

         ②若ACK包丢失,Server的状态经过重发后状态已经变为CLOSED,此时在接收到Client报文,Server会返回给Client一个RST报文,重置连接且重新发起connect()。

3、TCP/IP的四次挥手
当Client和Server数据传输完毕后,建立的连接资源需要被释放,过程如下:

说明:
  1. Client发起连接释放的请求,FIN=1,seq=u,发送后Client状态变为FIN_WAIT1。
    Source portDestination port
    Sequence number=U
    Acknowledgment number(if ACK set)
    Data 
    offset

    U

    R

    G

    AC

    K

    P

    S

    H

    RS

    T

    S

    Y

    N

    1
    Windows
    checksumUrgent point(if URG set)
    Any options
    user data
  2. Server接收到Client发送的FIN报文后,返回给Client ACK报文,seq=v,ack=u+1,同时状态变为CLOSED_WAIT;Client接收到ACK报文后,状态变更为FIN_WAIT2。

    Source portDestination port
    Sequence number=V
    Acknowledgment number(if ACK set)=U+1
    Data 
    offset

    U

    R

    G

    1

    P

    S

    H

    RST

    S

    Y

    N

    F
    I
    N
    Windows
    checksumUrgent point(if URG set)
    Any options
    user data
  3. 稍后,Server发送FINACK报文(seq=w,ack=u+1),关闭连接,同时状态变为LAST_ACK。

    Source portDestination port
    Sequence number=W
    Acknowledgment number(if ACK set)=U+1
    Data 
    offset

    U

    R

    G

    1

    P

    S

    H

    RST

    S

    Y

    N

    1
    Windows
    checksumUrgent point(if URG set)
    Any options
    user data
  4. Client接收到Server第二次发来的FINACK报文,返回给Server ACK报文(seq=u+1,ack=w+1),此时状态变为TIME_WAIT。经过一段时间后(MSL),Client报文变为Closed。Server接收到Client的ACK报文后,状态变为CLOSED。

    Source portDestination port
    Sequence number=U+1
    Acknowledgment number(if ACK set)=W+1
    Data 
    offset

    U

    R

    G

    1

    P

    S

    H

    RST

    S

    Y

    N

    F
    I
    N
    Windows
    checksumUrgent point(if URG set)
    Any options
    user data

至此通信结束。

异常情况:
1)client发送的FIN报文丢失或长时间未接收到Server返回的ACK报文,会触发Client的报文重传机制。
2)Client没有接收到Server响应的ACK报文,触发重传机制,Server再次接收到FIN报文时会再次重发ACK报文,而Server端已经处于CLOSE_WAIT状态;
3)服务器有大量的CLOSED_WAIT状态:从TCP的挥手原理出发,Server在接收Client的FIN报文后会立即返回一个ACK报文,并进入CLOSED_WAIT状态。从应用层面,在错误日志里会有socket.error信息,抛出异常后,代码没有closedsocket()操作,也会产生大量的CLOSED_WAIT状态。
常见问题:
1)为什么断开连接需要四次挥手?
    答:当Server接收到client的FIN报文后,不会立即已FIN-ACK报文响应,因为Server可能有未处理完的报文消息,所以只返回确认收到的ACK报文作为应答,待消息处理完后在发送FIN_ACK报文关闭socket连接。
2)什么是2MSL等待状态?为什么要进行2MSL的等待周期?
    答:MSL(Maximum segement Lifetime)最大报文生命周期,他是任何报文在网络上存在的最长的时间,超过这个时间的报文将被丢弃。TIME_WAIT状态也称为2MSL等待状态,在这个状态内IP+port将不能被使用,待2MSL接收收才可以。

为了保证最后的ACK报文信息能在足够的时间内送达Server,避免Server接收不到ACK报文而不断的重发FINACK报文信息,同时Server没有接收到ACK报文,而进行重传FINACK报文到Client,Client再次发送ACK报文给Server,保证Server正常的进入连接关闭状态。



2020年9月18日                   

(有问题,请留言!你的建议是对我最大的帮助!)


文章转载自若安知鱼之乐,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论