TCP详解(一)服务和首部介绍

2023-11-15

引言

TCP全称传输控制协议(Transmission Control Protocol),它是一种传输层通信协议,提供了面向连接的、可靠的字节流服务。本文将会简要介绍TCP为应用层提供的服务以及TCP首部中的各个字段,并在后续的文章中详细介绍。

TCP的服务

TCP提供一种面向连接的、可靠的字节流服务。

什么是面向连接:一种网络协议,依赖发送方和接收器之间的显示通信和阻塞以管理双方的数据传输。网络系统需要在两台计算机之间发送数据之前先建立连接的一种特性。
举个例子,AB两地被一条河隔开了,一群在A的人想要去B。
在这里插入图片描述如果他们是一群面向连接的人,那他们就会先在河上架座桥再过去。
在这里插入图片描述因为架桥也是需要时间的,所以面向连接的效率通常不高。
相对的,使用UDP的面向无连接的人会这么干:”GOGOGO,RUSH B!“,然后跳下河游向对面,可能有的狼灭很快啊,直接就游到了对面,比搭桥不知道快到哪里去了;可能有的人直接白给,被水冲到不知道哪里去;也可能有人从不知道哪里过来了。最后,可能有的人早就到了,有的人很迟才来,有的人就失踪了。在这里插入图片描述
因为TCP是面向连接的,所以两个使用TCP的应用(通常是一个客户和一个服务器)在通信之前必须先建立一个TCP连接。这就好像过河前要先造桥。而且面向连接的这帮人只会从这座桥上过去,只会从A过桥到B,因此TCP不支持广播和多播。当然,我们说TCP是可靠的,光造桥肯定是不行的,还需要更多的措施。
保证TCP可靠的主要措施有:

  • 超时重传:当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
  • 确认应答:当一端收到发自TCP连接另一端的数据,它将发送一个确认。
  • 序列号:对于每一个发送的数据报,TCP会对其进行编号。
  • 按序到达:TCP报文段作为I P数据报来传输,而 IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。如果必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。
  • 流量控制: TCP连接的每一方都有固定大小的缓冲空间。 TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲
    区溢出。
  • 拥塞控制:TCP会根据当前的网络拥堵状态,调整发送数据的大小
  • 校验和:TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段(希望发端超时并重发)。

以上内容会在后续详细介绍。

TCP首部

TCP数据被封装在一个IP数据报中。
在这里插入图片描述TCP首部的数据格式如下,不计任选字段时,通常为20字节。
在这里插入图片描述
因为后面的字段会和标志比特有关,所以先介绍6个标志比特的作用:

  • 标志比特
URG 紧急指针(urgent pointer)有效
ACK 确认序号有效
PSH 接收方应该尽快将这个报文段交给应用层
RST 重建连接
SYN 同步序号用来发起一个连接
FIN 发端完成发送任务
  • 源端口号和目的端口号:每个TCP段都包含源端和目的端的端口号,用于寻找发端和收端应用进程。这两个值加上IP首部中的源端IP地址和目的端IP地址唯一确定一个TCP连接。

  • 序号:序号用来标识从发端发送至收端的数据字节流,表示这个报文段中的第一个数据字节。序号是32bit的无符号数,到达2^32-1后从0开始。当建立一个新的连接时,SYN会置1,序号字段包含由这个主机选择的该连接的初始序号ISN(Initial Sequence Number)。该主机要发送数据的第一个字节序号为这个 ISN加1,因为SYN标志消耗了一个序号。

  • 确认序号:确认序号包含确认的一端所期望收到的下一个序号。因此,确认序号应当是上次已成功收到数据字节序号加 1。只有ACK标志为 1时确认序号字段才有效。

  • 首部长度:首部长度说明首部中有多少个32bit字。需要这个值是因为任选字段的长度是可变的。这个字段占4 bit,因此T C P最多有60字节的首部。没有任选字段,正常的长度是 2 0字节。

  • 窗口大小:该字段用于维护TCP的滑动窗口,TCP的流量控制便是由连接的每一端通过声明的窗口大小来提供。窗口大小为字节数,起始于确认序号字段指明的值,这个值是接收端正期望接收的字节。窗口大小是一个 16bit字段,因而窗口大小最大为 65535字节。

  • 校验和:检验和覆盖了整个的TCP报文段:TCP首部和TCP数据。这是一个强制性的字段,一定是由发端计算和存储,并由收端进行验证。采用16bit二进制反码求和计算校验和,详细计算过程可以在网上搜索。

  • 紧急指针:只有当URG标志置1时紧急指针才有效。紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。 TCP的紧急方式是发送端向另一端发送紧急数据的一种方式。

  • 选项:最常见的可选字段是最长报文大小,又称为 MSS (Maximum Segment Size)。每个连接方通常都在通信的第一个报文段(为建立连接而设置 SYN标志的那个段)中指明这个选项。它指明本端所能接收的最大长度的报文段。

参考《TCP-IP详解卷1:协议》17章并进行整理

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TCP详解(一)服务和首部介绍 的相关文章

随机推荐

  • Windows10 - 如何开机自动启动邮件,如何开机启动指定应用

    打开文件夹 C ProgramData Microsoft Windows Start Menu Programs StartUp 如果没有就新建StartUp Windows会自动将StartUp识别为中文的 启动 然后从开始菜单 将邮件
  • Python&PyQt5报错:AttributeError: module 'PyQt5.QtGui' has no attribute 'QMainWindow'

    在学习Python的PyQt5时 遇到了第一个问题 AttributeError module PyQt5 QtGui has no attribute QMainWindow 代码如下 运行之后 出现如下错误 在https stackov
  • 第一章 初识Web

    前言 这部分我们将要了解到哪些前端内容 直接切入正题 对于Web前端 最基础的内容是 HTML CSS JavaScript三个东西 其中JavaScript是最为核心内容 如果说html和css决定一个前端工程师的下限 那么javascr
  • 宠物项目统计

    Override public StatisticsMemberAllResponse getStatisticsByRequest StatisticsMemberRequest request StatisticsMemberAllRe
  • 解决安卓悬浮窗异常:java.lang.IllegalArgumentException

    在开发安卓悬浮窗的过程中有可能会遇到这个异常 java lang IllegalArgumentException View not attached to window manager 原因 如果是在执行android view View
  • 用一个数组实现两个栈(共享栈)

    共享栈 一个数组实现两个栈 第一个栈是开头 第二个栈是结尾 用c语言实现 很简单 两个指针一个数组就够了 上代码 define CRT SECURE NO WARNINGS 1 include
  • Windows中从浏览器启动本地应用程序 Pluggable Protocol

    项目中需要从网页中打开一个本地应用程序 并传递给应用程序启动参数 方法有很多 最简单的一种是通过自定义协议 类似于mailto http https 主流浏览器都支持 只需要在注册表中添加相应内容即可 官方叫做 Pluggable Prot
  • 在CentOS 7中使用BIND部署DNS服务器 - 正向/反向解析

    DNS Domain Name System 域名系统 用于解析域名与IP地址的映射关系 根据主机名 域名 解析对应的IP地址称之为正向解析 根据IP地址解析对应的主机名 域名 称为之反向解析 DNS服务器又分为主服务器 从服务器和缓存服务
  • 进制转换成_10to16

    include math h void 10to16 char 10 char 16 int n n atoi 10 sprintf 16 x n main char 10 20 16 20 printf input 10 jinzhi n
  • QT 去掉标题栏和去掉标题栏后移动窗口

    转自 http www 2cto com kf 201302 191602 html 在用QT编写界面时 去掉标题栏方法比较简单 就一行代码 this gt setWindowFlags Qt FramelessWindowHint 去掉以
  • go 无限极分类实现 返回树状排列数据 或 树状层级数据

    根据从数据表中查询的多条数据得到树状数据 数据表中根据 id 与 pid进行区分上下级 具体实现如下 1 分类排列 Menu 菜单 type Menu struct Id int Pid int CateName string Desc s
  • go 关于redis包的依赖包go.opentelemetry.io/otel下载出现i/o timeout

    通过go get u v github com go redis redis对redis包进行添加 会出现i o timeout的错误 对于该依赖包的解决方法在百度查找不到 但是可以找到相关的网站 https opentelemetry i
  • 中文停用词

    一 数 日 0 1 2 3 4 5 6 7 8 9 lt gt gt gt A Lex exp sub sup
  • 专题详解-5G接入控制(1)

    相关文章会在公众号同步更新 公众号 5G通信大家学 持续更新的相关5G内容都是直接根据3GPP整理 保证更新内容的准确性 避免通过二手 甚至多手的资料 以讹传讹误导网友 最近工作中遇到了一些5G专网接入限制的问题 以前没仔细研究 借着解决这
  • angular路由参数路由跳转

    路由参数及跳转 本节介绍路由参数及跳转相关 准备工作 首先 我们需要将上一节的 CommentService UserService抽离成单独的文件 以便多处使用 ng g s components router study comment
  • Python入门_使用while循环计算1-100之间偶数和

    案例 计算1 100之间所有偶数的和 i 1 定义一个变量sum为0 用来存放和 sum 0 while i lt 100 每次sum和i相加 if i 2 0 sum i i 1 执行完之后 打印sum的值 print 1 100之间偶数
  • Nginx实现反向代理和负载均衡

    Nginx安装 本文章主要介绍下 如何使用Nginx来实现反向代理和负载均衡 Nginx安装和基础知识 可参考我的这篇文章 Nginx安装 Nginx实现反向代理 实现反向代理需要准备两台Nginx服务器 一台Nginx服务器A ip为 1
  • leetcode33. 搜索旋转排序数组

    整数数组 nums 按升序排列 数组中的值 互不相同 在传递给函数之前 nums 在预先未知的某个下标 k 0 lt k lt nums length 上进行了 旋转 使数组变为 nums k nums k 1 nums n 1 nums
  • 【Python编程】如何在 Jupyter Notebook 中切换虚拟环境

    如何在 Jupyter Notebook 中切换虚拟环境 一 操作步骤 1 首先切换到想要在 Jupyter Notebook 里使用的虚拟环境 conda activate 环境名称 2 安装 ipykernel conda instal
  • TCP详解(一)服务和首部介绍

    文章目录 引言 TCP的服务 TCP首部 引言 TCP全称传输控制协议 Transmission Control Protocol 它是一种传输层通信协议 提供了面向连接的 可靠的字节流服务 本文将会简要介绍TCP为应用层提供的服务以及TC