背景
TCP/IP协议是当前网络时代的基础,所有的网络产品,或者是开发语言、开发框架都是基于tcp/ip协议的,所以说,学好tcp/ip对个人以后从事互联网行业会有巨大的帮助。
但是这是一个基础理论课程,就像操作系统这门课一样,学完之后可能不会对你产生太大的影响,不会让你立马拥有能够投入工作中的技能。但正是因为这是一个基础理论课,所有的互联网技术都是基于它的。所以如果你了解tcp/ip协议,将会对你未来发展或者在工作中排查问题产生积极的作用。
tcp头部格式
tcp头部信息会出现在每个tcp报文中,用于指定通信的源端端口,目的端口,管理tcp连接,重传,滑动窗口等等。每行32位,0-31表示。
tcp头部格式如下:
源端口和目的端口
-
tcp如何唯一标示一个连接?
当然是tcp连接四元组:源IP、源端口、目标IP、目标端口 -
tcp报文头部为什么没有IP信息?
因为IP在网络层就已经处理了,tcp只需要记录两端的端口即可
***
报文段的第一个字节。***是一个长为4字节,32位的整数,表示范围为0~2^32-1。如果达到了最大值就循环到0。
- ***在通信中的作用
- 在
SYN报文中交换彼此的初始化*** - 保证数据包按照正确的顺序进行组装
-
ISN:Initial Sequence Number
初始化***。在3次握手的过程中,双方会通过SYN报文来交换彼此的ISN值ISN并不是一个固定的值,而是每
4ms加1,溢出则回到0,这个算法使得猜测ISN变得很困难。那么为什么要这么做呢?要知道,
源IP和源端口都是很容易伪造的,如果ISN被攻击者预测到了,直接伪造一个RST请求后,那就可以强制断开连接,这是非常危险的。而动态增长的ISN大大提高了猜测ISN的难度。
确认号
用来告知对方下一个期望接收到的***,表示小于ACK的所有数据包已经全部收到。
头部长度
标识该tcp头部有多少个4字节。因为偷头部长度只有4位,最大能表示15,所以tcp头部最长是60字节。
保留位
暂时保留
标记位
常见的标记位有:URG、ACK、PSH、RST、SYN、FIN
-
URG:表示紧急指针是否有效 -
ACK:确认收到请求 -
PSH:push,告知对方,这些数据包收到后要立马交给上层应用。不能缓存 -
RST:reset,重制复位标志,强制断开连接 -
SYN:发送/同步标志,用来建立连接 -
FIN:即finish,表示发送方准备断开连接
窗口大小
窗口大小占16位,实际上这是不够用的。因此tcp引入了窗口缩放选项,作为窗口缩放的比例因子,这个因子的范围是0~14,比例因子可以将窗口扩大位原来的2^n次方。
校验和
占用2个字节,防止传输过程中数据包损坏或者被篡改,如果遇到校验和有差错的报文,tcp直接丢弃,等待重传。
选项
可选项的格式如下:
| 种类(kind) 1byte | 长度(length) 1byte | 值(value) |
|---|
常用的可选项有一下几个:
-
TimeStamp:tcp时间戳 -
MSS:指的是tcp允许从对方接收的最大报文段 -
SACK:选择确认选项/选择性重传 -
WindowScale:窗口缩放选项
总结
这是tcp/ip系列的第五篇,主要详细介绍了tcp头部组成部分。后面还有更深入、更多使用的场景讲解,这个系列的文章会很长。
开始下一篇吧。