背景
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
头部组成部分。后面还有更深入、更多使用的场景讲解,这个系列的文章会很长。
开始下一篇吧。