• TCP/IP第四层协议TCP(一)


    toc

    TCP协议

    TCP提供了一种面向连接的、可靠的字节流服务。
    需要通过TCP通信的双方必须建立一条TCP连接,并且仅支持建立连接的双方一对一的进行通信,广播与多播并不能用于TCP
    TCP是面向字节流的协议,应用程序的数据被分割成TCP认为最合适的大小的发送数据块

    可靠性的保证

    TCP的可靠性由下面的七种方式保证

    1. 序列号
      由于TCP报文段以IP数据报来传输的
      • 可能出现乱序问题,通过对数据包排序,接收端能正确处理好乱序问题。
      • 可能出现重复数据,通过序列号可以使接收端丢弃重复的数据,能避免重复数据
      • 可能丢失数据,通过序列号可以知道是哪个数据包在传输的过程中丢失了。
    2. 校验和
      TCP提供覆盖首部和数据部分的校验和
    3. 超时重传
      当发送端发出一个报文段后,会启动一个定时器(重传定时器),等待接收端对这个报文段的确认,如果在超时时间内不能收到确认,则重传该报文段
    4. 确认应答(ack)
      当TCP接收端收到发送端的报文段后,它会发送一个确认。但这个确认通常不是立即发送的,而是会有一个延迟,并且当三次重传同一ACK时,就执行快速恢复
    5. 连接管理
      收发双方通过三次握手、四次挥手来建立、断开一个连接,并且各自有一个状态机来维护这一个连接。
    6. 流量控制
      接受端有一个固定大小的缓冲区,TCP根据接收端的处理能力来决定发送端发送的速度,以防止发送端发送过快导致的接收端缓冲区溢出
    7. 拥塞控制
      通过发送端对网络情况的探查,控制发送端发送的数量,防止过多的数据发送到网络中导致网络过载而丢包。

    协议格式



    TCP包首部通常是20字节,选项部分最多不超过40字节(和IP首部一样):

    • 16位源端口号:发送进程端口号
    • 16位目标端口号:接收进程端口号
      • 每个TCP首部都包含源端口号与目标端口号,用于对应发送进程与接收进程,这两个端口号再加上IP首部中的源IP地址与目标IP地址可以唯一的确定一条连接,并可以唯一确定一条TCP连接的双方。
      • 一个端口号和一个IP地址被称为一个插口(socke)或插口对(socke pair)
    • 32位序号:序号用来标识从TCP发送端向TCP收接收端发送的数据字节流,它表示在这个报文段中的的第一个数据字节。如果将字节流看作在两个应用程序间的单向流动,则TCP用序号对每个字节进行计数。序号是32bit的无符号数,序号到达2^32-1后又从0开始。
      • SYN标志会消耗一个序号,FIN标志也会消耗一个序号。
    • 32位确认序号:确认序号应当是上次已成功收到数据(成功接收并且校验和正确)字节序号加1。只有ACK标志为1时确认序号字段才有效。
      • 发送ACK无需任何代价,因为32bit的确认序号字段和ACK标志一样,总是TCP首部的一部分。一旦一个连接建立起来,这个字段总是被设置,ACK标志也总是被设置为1。
      • TCP为应用层提供全双工服务。这意味数据能在两个方向上独立地进行传输。因此,连接的每一端必须保持每个方向上的传输数据序号。
    • 4位首部长度:首部长度指的是首部占32bit字的数目,包括任何选项。它是一个4比特字段,当4个比特全为1时,即1111(十进制为15)时,首部长度可达最长的60个字节。
    • 6个比特标志位:
    URG
    紧急指针(urgentpointer)有效
    ACK
    确认序号有效
    PSH
    接收方应该尽快将这个报文段交给应用层,而不是等待判断是否有额外的数据到达
    RST
    重建连接
    SYN
    同步序号,用来发起一个连接
    FIN
    发端完成发送任务
    • 16位窗口大小:可能是通告窗口或是拥塞窗口,由该TCP是接收端或发送端来决定。窗口最大为65535字节。
    • 16位校验和:同时覆盖TCP首部和数据的校验和,由发端计算和存储,并由收端进行验证。
    • 16位紧急指针:只有当URG标志置1时紧急指针才有效。紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式。
    • 可选项:最常见的可选字段是最长报文大小,又称为MSS(MaximumSegmentSize)。每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志的那个段)中指明这个选项。它指明本端所能接收的最大长度的报文段。
    • 数据部分:TCP报文段中的数据部分是可选的。
      • 在一个连接建立和一个连接终止时,双方交换的报文段仅有TCP首部。
      • 如果一方没有数据要发送,使用没有任何数据的首部来确认收到的数据。
      • 在处理超时的许多情况中,也会发送不带任何数据的报文段。




    原创不易,转载请注明出处,谢谢
  • 相关阅读:
    批处理
    使用T-SQL语句更新数据、删除
    使用T-SQL语句一次性插入另一张表的数据
    使用T-SQL语句插入数据
    CSS色调旋转滤镜
    初探Lerna
    基层管理人员的部分思考 --读《大秦帝国》有感
    (转)React学习笔记(干货满满)
    git常用命令(转)
    个人JS体系整理(三)
  • 原文地址:https://www.cnblogs.com/Keeping-Fit/p/13994512.html
Copyright © 2020-2023  润新知