TCP连接之报文首部
在面试时,会经常被问到TCP报文的一些细节,可以说TCP报文是不少企业用来考察面试者对网络的掌握程度的一道题目。
TCP连接作为网络传输的一个环节,是不可或缺的一部分。例如,OSI七层模型的应用层HTTP就是基于TCP连接实现的。
TCP连接的三次握手和四次挥手机制相信是每个后台开发人员耳熟能详的知识点,那么关于TCP的报文细节以及背后的原理是怎么样的呢?TCP是怎样借助报文来实现三次握手和四次挥手呢?笔者通过阅读书本和加上自己的理解。通过本文,来谈谈TCP报文首部以及报文首部背后的原理。
首先先粘上一张TCP报文图

好了,下面介绍一些基础的内容
TCP虽然是面向字节流的,但TCP传送的数据单元却是报文段,一个TCP报文段分首部和数据两部分,其中很关键的就是TCP的报文头,TCP的全部功能都体现在首部中的各个字段中。
TCP报文段首部的前20个字节(上图有标识)是固定的,后面有4n字节(如果有选项最少为4字节)是根据需要添加的选项,所以TCP首部的最小长度是20字节。
1. 源端口号和目的端口号:
各2个字节,分别写入源端口号和目的端口号。端口就是我们熟悉的65536个套接字的端口号,显然,源端口号和目的端口号跟TCP的分用功能有着密切的关系,不同的应用使用不同的端口号,这样就可以互不干扰。而通信的双方的端口号必须相同,才能保证这一条通道是连接畅通的。
2.序列号(32位)
TCP是面向字节流的。在一个TCP连接中传送的字节流中的每一个字节都是按顺序编号。整个要传送的字节流的起始序号必须在连接建立时就要设置。首部中的序号字段值指的是本报文段所发送的数据的第一个字节的序号。例如一个报文段的序号字段值是101,它的长度是100,那么跟在它后面的报文的序号字段值就是从201开始。
3. 确认号(32位)
是期望收到对方下一个报文段的第一个数据字节的序号。例如TCP通信双方分别为A和B,在B正确收到A发送过来的一个报文段,例如就上面的101-200字节,那么B期望的收到下一个报文段就必须是从201开始。于是B在发送A的确认报文段中把确认号设置为201。
说到这里,上面叙述的三次握手机制的实现原理就比较清晰了,TCP连接通过序号和确认号精确地把一定长度的数据段从连接的一端传送到另一端。
4. 数据偏移
因为选项字段部分,数据偏移就显得尤为重要了。因为选项部分报文段的长度是4n,这个长度是不确定的,如果不标记这个报文段的报头长度,就无法确定报文段的数据部分是从哪一个字节开始,这样在解析报文的时候会出现麻烦。数据偏移就是为了解决这个问题而设计的。
5. URG(紧急)
当URG等于1时,表明紧急指针字段有用。它用来告诉系统,这个报文段中有紧急的数据,应该尽快发送。当紧急标志被置1的时候,紧急数据就会被放在本报文段的首部,这样做的好处是,让紧急数据尽快发送到TCP的接收方。例如:在一大段程序通过TCP连接从发送方发往接收方,已经发送了一部分,但由于一些原因,例如发送方发送了像Ctrl+C(通常为中断服务器服务)这类指令的时候,希望接收方尽快收到这样的紧急信号,如果放在数据报的末尾,未免太慢了,因为这两个字符会被放置在接收方缓存的末尾,在所有数据都被处理完毕后才交付到接收方的应用进程。
6. ACK(确认)
这个字段是TCP通信过程比较常见的字段。当ACK=1时,确认号字段才有效,而确认号字段在上文已经说过,是发送端希望接收端下一次发送的数据的序列号。TCP协议规定,当TCP连接建立之后,所有的发送的报文ACK都置为1。也就是说,ACK字段能够辨别TCP连接是否建立成功。如果是一个运维工程师,抓包来分析不同的字段,这个字段应该是再熟悉不过了。
7. PSH(推送)
有时当两个应用进程进行交互式的通信,有时在一段的应用进程希望在输入一个命令的时候得到接收方的响应,这个时候,TCP就可以使用推送操作。接收放收到推送字段置1的报文段,就尽快地交付给接收应用进程,而不再等到整个缓冲都填满了再向上交互。但是据说实际上这个字段用得很少,因为TCP本身可以实现这个功能。
8. RST(复位)
当RST = 1时,表明TCP连接中出现了严重错误。例如主机崩溃或者其他原因,必须释放连接。然后在 重新建立运输连接。
9. SYN(同步)
在连接建立时用来进行同步的信号。当SYN = 1而ASK = 0时,表明这是一个连接请求报文。对方若同意建立连接,则在响应的报文段中使SYN = 1 ,ACK = 1。
10 .FIN(终止)
用来释放一个连接,当FIN = 1时,表明此报文段的发送方的数据已经发送完毕,并释放TCP连接,这个字段只有在TCP的四次挥手时候才会被置为1.
11.检验和
检验和字段检验(报文的)范围包括首部和数据两部分。在计算检验和时,都要在TCP报文段的前面添加12字节的伪首部。检验和有什么用?这关系到报文的正确性问题。为了保证TCP连接上传输的数据的正确性,即从发送方传送到接收方没有出现错误,用检验和来确定数据传输过程是否发生了错误。
12.紧急指针
紧急指针在URG = 1时才有意义,它指出本报文段中的紧
TCP连接之报文首部的更多相关文章
- TCP三次握手及TCP连接状态 TCP报文首部格式
建立TCP连接时的TCP三次握手和断开TCP连接时的4次挥手整体过程如下图: 开个玩笑 ACK: TCP协议规定,只有ACK=1时有效,连接建立后所有发送的报文ACK必须为1 SYN(SYNchron ...
- TCP协议承载的DNS报文,DNS报文首部前多出两个字节的DNS报文长度字段,是何意义?
一.TCP报文头部简介 ●源.目标端口号字段:占16比特.TCP协议通过使用"端口"来标识源端和目标端的应用进程.端口号可以使用0到65535之间的任何数字.在收到服务请求时,操作 ...
- TCP报文首部详解
首部固定部分各字段的意义如下: 1.源端口和目的端口,各占2个字节. 2.序号:占4个字节,序号范围为0到2的32次方-1,序号增加到2的32次方-1之后,下一个序号变为0,在一个TCP连接中传送的字 ...
- python网络编程--TCP连接的三次握手(三报文握手)与四次挥手
一.TCP连接 运输连接有三个阶段: 连接建立.数据传送和连接释放. 在TCP连接建立过程中要解决以下三个问题: 1,要使每一方能够确知对方的存在. 2.要允许双方协商一些参数(如最大窗口之,是否使用 ...
- TCP概述\三次握手四次挥手\报文首部,常用熟知端口号
06.26自我总结 1.TCP概述 TCP把连接作为最基本的对象,每一条TCP连接都有两个端点,这种端点我们叫作套接字(socket),它的定义为端口号拼接到IP地址即构成了套接字,例如,若IP地址为 ...
- TCP报文首部
源端口和目的端口,各占2个字节,每个TCP报文段都包含源端口号和目的端口号,用于寻找发送端和接收端的应用进程: 序号,占4个字节,序号用来标识从TCP发送端向TCP接收端发送的数据字节流,它表示在这个 ...
- TCP连接过程及报文解析
可能大家都听过TCP建立连接时需要经历三次握手和四次挥手的. 那么具体的握手挥手的过程是怎么样的呢? 这篇文章就通过WireShark抓包来了解TCP连接建立和断开的过程. 实验方法: 写一段简单的代 ...
- 简述TCP连接的建立与释放(三次握手、四次挥手)
在介绍TCP连接的建立与释放之前,先回顾一下相关知识. TCP是面向连接的运输层协议,它提供可靠交付的.全双工的.面向字节流的点对点服务.HTTP协议便是基于TCP协议实现的.(虽然作为应用层协议,H ...
- 一个完整的TCP连接
当我们向服务器发送HTTP请求,获取数据.修改信息时,都需要建立TCP连接,包括三次握手,四次分手. 什么是TCP连接? 为实现数据的可靠传输,TCP要在应用进程间建立传输连接.它是在两个传输用户之间 ...
随机推荐
- MySQL:基础架构和工作流程
[参考文章]:01|基础架构:一条查询语句的执行流程 1. 基本架构 大体来说,MySQL可以分为Server层和存储引擎两部分. Server层包括链接器,分析器,优化器,执行器等,涵盖大多数核心服 ...
- Linux下安装配置与使用MySQL数据库
Linux下安装配置与使用MySQL数据库 在Linux下安装做开发时往往少不了要使用到MySQL数据库,下面就Linux系统为例讲解一下,如何安装MySQL数据库,如何启用/停.止MySQL服务,如 ...
- HoloLens开发手记 - 使用Visual Studio Using Visual Studio
不论你是否使用DirectX或Unity来开发全息应用,你都会使用Visual Studio 2015来进行调试和部署应用.在本部分,你将会学习以下内容: 如何通过Visual Studio将你的应用 ...
- hdu 6161--Big binary tree(思维--压缩空间)
题目链接 Problem Description You are given a complete binary tree with n nodes. The root node is numbere ...
- .net core + headless chrome实现动态网页爬虫
一般的http请求库只能够抓取到网页的静态内容,如果想抓取通过js动态生成的内容可以使用没有gui的browser库,之前许多人会使用phantomjs作为headless browser,不过现在p ...
- springboot属性注入转化为对象
第一种方式:用spel表达式解析 @Value("#{ T(com.alibaba.fastjson.JSON).parseObject('${train.purchase}')}" ...
- Spring Boot SSL [https]配置例子
前言 本文主要介绍Spring Boot HTTPS相关配置,基于自签证书实现: 通过本例子,同样可以了解创建SSL数字证书的过程: 本文概述 Spring boot HTTPS 配置 server. ...
- [java初探09]__关于java的包装类
前言 在Java语言的学习过程中,我们逐渐的理解了Java面向对象的思想,与类和对象的应用.但是在基本数据类型的使用上,我们无法将其定义为一个对象,通过使用对象的方法来使用它们,但是Java语言的思想 ...
- Python爬虫之网页图片抓取
一.引入 这段时间一直在学习Python的东西,以前就听说Python爬虫多厉害,正好现在学到这里,跟着小甲鱼的Python视频写了一个爬虫程序,能实现简单的网页图片下载. 二.代码 __author ...
- Vue 动态加载组件
为什么要动态加载呢?而不是一次性加载呢? 一次性?你能保证你拿的内容不多,那从性能方面说还是OK的.否则,就该什么时候用,就什么时候取. 得出这想法,源于前几天上班赶产品的故事: A组件是父亲,B组件 ...