• TCP协议详解


            在五层模型中,传输层的典型代表就是TCP协议。TCP协议由于其天然自带的可靠性,广泛的使用在互联网的各项业务中。

    一,TCP协议的特点

    • 面向连接
    • 每一条TCP连接只能是点对点的。
    • TCP提供可靠交付服务  无差错 不丢失  不重复  按序到达
    • TCP提供全双工通信→发送缓存(准备发送的数据&已发送但尚未收到确认的数据)
    •                接收缓存(按序到达但尚未被接受程序读取的数据&不按序到达的数据)
    • 面向字节流→TCP把应用程序交下来的数据看成是一连串无结构的字节流

    二,TCP协议首部格式

    TCP协议的首部格式如下: 

            TCP首部包括20字节的固定首部部分和选项(长度可变)部分,然后TCP首部和TCP的数据部分组成组成TCP报文段,这是在传输层,TCP报文段在网络层就成为了网络层的IP数据部分,然后再加上IP首部就组成了IP数据包。

            下面对TCP首部的各个字段进行逐一解释:

    1,源/目的端口号

            TCP传输的数据要从A计算机的一个进程传输到B计算机的一个的话,除了在网络层通过指定IP地址来唯一的确定目标计算机,还需要通过在传输层的TCP首部中说明自己携带的信息来自于自己的哪个端口,又需要到达目标计算机的哪一个端口,从而被目标计算机的特定进程所使用,从而与网络层的IP地址一起构成完整的套接字。从上图可以看到源端口和目标端口各占两个字节,16位,16位可以表示的端口范围是0-65535。

    2,序号

            seq占4个字节,在TCP的三次握手、四次挥手和数据传输过程都有用到,用来标记字节流的序号,因为数据传输过程中并不总是有序到达,为了保证数据的无差错传输,必须把每个报文段标记一个序号,这个序号表示一个报文段开始的位置,如果一个报文段序列号为1,报文段长100字节,那么下一个报文段就为101。

    3,确认号

            ack占4个字节,接收方在收到数据后需要给发送方一个确认,告诉接收方收到了某一个报文。而接收方收到的报文段很多,为了让接收方知道是哪一个报文段的确认,TCP协议规定了确认号为期待收到的下一个报文段的序列号。假设接收方收到了一个报文段seq=1,报文长100字节,那么确认号为101,表明1~100的数据都已经收到。

    4,数据偏移

            数据偏移占4位,表示TCP首部长度,之所以叫数据偏移而没有称为首部长度,大概是为了强调正真的数据部分距离该报文段的起始处的距离。TCP的固定首部长度为20个字节,可变长度为40个字节,因此,首部最大长度为60个字节

    5,标志位

    • 紧急URG:当URG=1时,表明紧急指针有效。它告诉系统此报文段中有紧急数据,应尽快发送(相当于高优先级的数据),而不要按原来的排队顺序来传送。例如,已经发送了很长的一个程序要在远地的主机上运行。但后来发现了一些问题,需要取消该程序的运行,因此用户从键盘发出中断命令。如果不使用紧急数据,那么这两个字符将存储在接收TCP的缓存末尾。只有在所有的数据被处理完毕后这两个字符才被交付接收方的应用进程。这样做就浪费了很多时间
    • 确认ACK: 仅当ACK = 1时确认号字段才有效,当ACK = 0时确认号无效。TCP规定,在连接建立后所有的传送的报文段都必须把ACK置为1。
    • 推送PSH: 当两个应用进程进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后立即就能收到对方的响应。在这种情况下,TCP就可以使用推送(push)操作。这时,发送方TCP把PSH置为1,并立即创建一个报文段发送出去。接收方TCP收到PSH=1的报文段,就尽快地(即“推送”向前)交付接收应用进程。而不用再等到整个缓存都填满了后再向上交付。
    • 复位RST(ReSeT):当RST=1时,表名TCP连接中出现了严重错误(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立传输连接。RST置为1还用来拒绝一个非法的报文段或拒绝打开一个连接。
    • 同步SYN(SYNchronization):  在三次握手建立连接时使用。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使SYN=1和ACK=1,因此SYN置为1就表示这是一个连接请求或连接接受报文。
    • 终止FIN(FINis):  用来释放一个连接。当FIN=1时,表明此报文段的发送发的数据已发送完毕,并要求释放运输连接。

    6,窗口

            窗口占2字节。窗口大小表示接收方允许发送方发送报文段的多少,以字节为单位,在数据传输过程中是动态变化的。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。如果序号seq=1,窗口大小为1000,则表明接受方的缓存空间可以接受1000字节(序号为1~1000)的数据。

    7,检验和

            占2字节。检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,不只是检验数据部分,把首部和数据部分一起检验。在发送方,将伪首部和首部以及数据部分连在一起,将其看成许多16位字串接起来的,如果数据部分不是偶数个字节,则要填充一个全零字节,然后按照二进制反码计算出这些16位字的和,高位超出进一,则进行地位叠加,最后将求得的和的反码即为发送方的检验和;在接收方,将收到的数据和伪首部一起,用二级制反码计算这些16位字的和,若结果全1,则表明无差错,否则丢弃错误报文段。简单来说,即在发送方,原码相加,高位叠加到低位,取反码,放入校验和;在接收端,将所有原码相加,高位叠加到地位, 如全为1,则正确。

    8,紧急指针

            占2字节。紧急指针仅在URG=1时才有意义,它指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据) 。因此,在紧急指针指出了紧急数据的末尾在报文段中的位置。当所有紧急数据都处理完时,TCP就告诉应用程序恢复到正常操作。值得注意的是,即使窗口为0时也可以发送紧急数据。

    9,选项

            长度可变,最长可达4字节。当没有使用“选项”时,TCP的首部长度是20字节。选项包含最大报文段长度(MSS)、窗口扩大、时间戳、选择确认等。

  • 相关阅读:
    Java小树的参天成长【基本类型与字符串之间的转化】
    2023秋招大厂经典面试题及答案整理归纳(341-360)校招必看【Linux篇】
    [报告] Microsoft :Application of deep learning methods in speech enhancement
    后端使用aop和redis实现防抖
    就在刚刚这份java八股文成功让我进入字节,拿到了人生第一个18k
    2.6W字系统总结,带你实现 Linux 自由!
    图解网络(三)——TCP篇01
    创新实战|从5大维度成功实现传统研发向敏捷研发转型
    『现学现忘』Docker基础 — 27、Docker镜像的commit操作
    从4开始,在后端系统中增加用户注册和登录功能
  • 原文地址:https://blog.csdn.net/qq_27071221/article/details/134042120