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要在应用进程间建立传输连接.它是在两个传输用户之间 ...
随机推荐
- centos部署flask
1.先安装uwsgi pip install uwsgi 2.在你的项目根目录下创建一个配置文件uwsgiconfig.ini(uwsgi支持多种配置文件格式,xml,ini,json等) [uwsg ...
- eval() 和 with()
作用域完全由写代码时的函数声明所决定,js有两种机制可以实现”破坏“我们对作用域的常规理解,通过eval()和with(). 1. eval()函数接受字符串为参数,并将其中的声明提升到eval()函 ...
- python3中的range函数返回的是列表吗?
注意,这里说的Python3里面的range函数,和Python2是不同的,返回的不是列表,是可迭代对象. 在python3中,如果执行下面的语句 print(range(10)) 得到结果是 ran ...
- CentOS 6.5 网络服务器功能的实现②:运用光盘(镜像)制作一个本地yum源
在用Linux安装软件时(rpm安装方式),有时会出现“包依赖”的现象.因此,我们可以用yum工具来实现一次性安装所有rpm工具包的功能. 实例:在此服务器上用yum的方式安装DHCP服务和TFTP服 ...
- 带分页功能的SSH整合,DAO层经典封装
任何一个封装讲究的是,使用,多状态.Action: 任何一个Action继承分页有关参数类PageManage,自然考虑的到分页效果,我们必须定义下几个分页的参数.并根据这个参数进行查值. 然 ...
- 通过GitHub和GoDaddy搭建静态个人博客
一.创建GitHub个人主页 通过GitHub创建个人博客的好处:无广告,因为页面代码全是你自己写的:免费,不用买主机:装X:设计和编码练习. 1. 在GitHub上创建一个新的repository, ...
- TCP/IP 笔记 - 超时和重传
TCP协议为了提供可靠的数据传输服务,会启动数据重传来解决下层网络层(IP)可能出现的数据包丢失. 超时重传介绍 TCP重传由两套独立机制来完成重传,基于时间的超时重传(RTO,TCP发送数据时会设置 ...
- Eureka自我保护模式——难点重点
一.开启Eureka自我保护模式访问Eureka主页时,如果看到这样一段大红色的句子: EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ...
- centos7环境开启WIFI热点
1.环境介绍 [root@localhost ~]# cat /etc/redhat-release CentOS Linux release (Core) [root@localhost ~]# u ...
- python redis模块详解
前言 现在越来越觉得知识的沉淀尤为重要,最近打算慢慢的把一些知识点做个记录,如果长期不用生疏了也可以快速回顾.下面我会依次介绍在python中常用组件redis,rabbitmq,mongodb,E ...