zoukankan      html  css  js  c++  java
  • TCP/IP协议详解

    好,我们直接开始今天的 TCP/IP 协议,这两个协议与我们平时网络生活中的绝大部分内容都息息相关,包括现在打开的这个博客也是通过 TCP/IP 协议来发送到你的设备上的。

    1. TCP/IP 协议的四层结构

    在计算机网络中共包括四层结构,从上到下分别是应用层、传输层、网络层和链路层。

    应用层顾名思义就是我们的应用程序运行的层级,在这一层主要工作内容就是规定数据的格式,当然不同的应用层序可能有不同的数据格式要求,于是就产生了HTTP、HTTPS、FTP等各种各样的协议,这些协议都是属于应用层这一级的。

    传输层就是我们的 TCP 协议所在的层级了,TCP 协议可以提供可靠的数据传输,在传输成会将从应用层接收到的数据包装成一个 TCP 的数据帧,继续发送到网络层;也可以将从网络层接收到的数据分发到相应的应用程序,这里区分应用程序时通过端口来区分的,每个应用程序都会分配一个端口,相应的端口号会写到数据帧的报头中。

    网络层是 IP 协议所在的层级,顾名思义这一层将 IP 地址写进了 IP 数据帧的报头,并进行分组发送。

    链路层就是我们物理设备的层级了,每个网卡都有一个 MAC 地址,在这一层会将 MAC 地址写进数据帧的报头,并将数据帧广播到以太网;同时这一层也会接收到以太网上发送的数据帧,并检查报头中的 MAC 地址是否匹配,如果是发给自己的数据帧则接收,并剥离出 TCP 的数据帧发送给网络层。

    应用层规定数据格式,写入真正发送的数据;应用层提供可靠的数据传输,并写入端口号;网络层写入 IP 地址,进行分组发送,提供的是不可靠的数据传输;链路层写入 MAC 地址,并向以太网广播数据帧,同时也可以接收数据帧。整个数据包装就像套娃一样的一层套一层,上一层的报文是下一层的报头和报文。

    2. TCP 数据帧格式

    TCP数据帧

    标志位:

    URG:紧急标志,为 1 时表示有效,会有限处理该数据帧。

    ACK:确认标志,表明确认编号栏有效,提示远端系统已经成功接收数据。

    PSH:推标志,置位时接收端将不对该数据帧进行队列处理,而是尽可能的将数据转到应用处理。

    RST:复位标志,重新进行 TCP 连接。

    SYN:同步标志,表示同步序列号栏有效,尽在三次握手建立 TCP 连接时有效。

    FIN:结束标志,表示结束 TCP 连接。

    3. TCP 协议的三次握手

    三次握手

    第一次握手:客户端主动发起连接,向服务端发送 SYN 请求(SYN=1,seq=x);服务端确认客户端发送功能正常。

    第二次握手:服务端接收到客户端发送的 SYN 请求,发送 ACK 确认(SYN=1, ACK=1, ack=x+1, seq=y)客户端确认服务端接收和发送功能正常。

    第三次握手:客户端接收到服务端返回的 ACK 确认信息,发送连接建立确认 ACK (ACK=1,ack=y+1)服务端确认客户端接收功能正常,连接建立。

    下面看一个例子:

    这是我用抓包工具抓到的一次 TCP 连接的建立过程 ,共包括三次通信,即三次握手。

    橘色框内的是源IP,源端口和目的IP,目的端口。

    红色框内是标志位。

    紫色框内是序号。

    4. TCP 四次挥手

    四次挥手

    第一次挥手:客户端发送 FIN 请求关闭连接(FIN=1,seq=u),表示客户端不再发送数据,但是还可能接收服务端发送的数据。

    第二次挥手:服务端发送接收确认 ACK (ACK=1,seq=v,ack=u+1),表示服务端收到了客户端的关闭请求,不再接收客户端的数据,但仍可以向客户端发送数据。

    第三次挥手:服务端发送 FIN 关闭连接(FIN=1,ACK=1,seq=w,ack=v+1),服务端表示不再发送数据。

    第四次挥手:客户端发送接收确认 ACK(ACK=1,ack=w+1,seq=u+1),客户端表示知道了,完成断开 TCP 连接。

  • 相关阅读:
    推荐20个开源项目托管网站
    python 网络编程(网络基础之网络协议篇)
    python 异常处理
    python 内置函数的补充 isinstance,issubclass, hasattr ,getattr, setattr, delattr,str,del 用法,以及元类
    python3 封装之property 多态 绑定方法classmethod 与 非绑定方法 staticmethod
    python3 类 组合
    PYTHON3中 类的继承
    面向对象 与类
    包 与常用模块
    json 与pickle模块(序列化与反序列化))
  • 原文地址:https://www.cnblogs.com/dongyangblog/p/12104931.html
Copyright © 2011-2022 走看看