TCP/IP学习笔记5-tcp头部报文详解

背景

TCP/IP协议是当前网络时代的基础,所有的网络产品,或者是开发语言、开发框架都是基于tcp/ip协议的,所以说,学好tcp/ip对个人以后从事互联网行业会有巨大的帮助。

但是这是一个基础理论课程,就像操作系统这门课一样,学完之后可能不会对你产生太大的影响,不会让你立马拥有能够投入工作中的技能。但正是因为这是一个基础理论课,所有的互联网技术都是基于它的。所以如果你了解tcp/ip协议,将会对你未来发展或者在工作中排查问题产生积极的作用。

tcp头部格式

tcp头部信息会出现在每个tcp报文中,用于指定通信的源端端口,目的端口,管理tcp连接,重传,滑动窗口等等。每行32位,0-31表示。

tcp头部格式如下:
TCP/IP学习笔记5-tcp头部报文详解_第1张图片

源端口和目的端口
  • tcp如何唯一标示一个连接?
    当然是tcp连接四元组:源IP源端口目标IP目标端口

  • tcp报文头部为什么没有IP信息?
    因为IP在网络层就已经处理了,tcp只需要记录两端的端口即可

序列号

报文段的第一个字节。序列号是一个长为4字节,32位的整数,表示范围为0~2^32-1。如果达到了最大值就循环到0

  • 序列号在通信中的作用
  1. SYN报文中交换彼此的初始化序列号
  2. 保证数据包按照正确的顺序进行组装
  • ISN:Initial Sequence Number
    初始化序列号。在3次握手的过程中,双方会通过SYN报文来交换彼此的ISN

    ISN并不是一个固定的值,而是每4ms1,溢出则回到0,这个算法使得猜测ISN变得很困难。那么为什么要这么做呢?

    要知道,源IP源端口都是很容易伪造的,如果ISN被攻击者预测到了,直接伪造一个RST请求后,那就可以强制断开连接,这是非常危险的。而动态增长的ISN大大提高了猜测ISN的难度。

确认号

用来告知对方下一个期望接收到的序列号,表示小于ACK的所有数据包已经全部收到。

头部长度

标识该tcp头部有多少个4字节。因为偷头部长度只有4位,最大能表示15,所以tcp头部最长是60字节。

保留位

暂时保留

标记位

常见的标记位有:URGACKPSHRSTSYNFIN

  • URG:表示紧急指针是否有效
  • ACK:确认收到请求
  • PSHpush,告知对方,这些数据包收到后要立马交给上层应用。不能缓存
  • RSTreset,重制复位标志,强制断开连接
  • SYN:发送/同步标志,用来建立连接
  • FIN:即finish,表示发送方准备断开连接
窗口大小

窗口大小占16位,实际上这是不够用的。因此tcp引入了窗口缩放选项,作为窗口缩放的比例因子,这个因子的范围是0~14,比例因子可以将窗口扩大位原来的2^n次方。

校验和

占用2个字节,防止传输过程中数据包损坏或者被篡改,如果遇到校验和有差错的报文,tcp直接丢弃,等待重传。

选项

可选项的格式如下:

种类(kind) 1byte 长度(length) 1byte 值(value)

常用的可选项有一下几个:

  • TimeStamptcp时间戳
  • MSS:指的是tcp允许从对方接收的最大报文段
  • SACK:选择确认选项/选择性重传
  • WindowScale:窗口缩放选项

总结

这是tcp/ip系列的第五篇,主要详细介绍了tcp头部组成部分。后面还有更深入、更多使用的场景讲解,这个系列的文章会很长。
开始下一篇吧。

你可能感兴趣的:(tcp/ip协议)