文章图片
这张图好像挺有名的,其实一开始我看见的时候是一脸懵逼的,但是通过翻书(大学时代最害怕的计算机网络),查阅他人博客等等办法,最后终于有了一个系统的了解,当然,这里知识点多而杂,大家可以多看几遍,结合上面那张图,这张图实际上非常清楚,大家看完底下的内容再回来看这张图一定会恍然大悟。
首先,大家先看这张图,要先从底下往上看,下面这个左边是绿色右边是红色的长方形实际上是一个数据包:
IP首部:
这个地方实际上是IP地址,是我们要发送到的机器的IP地址
IP数据部分:
这个里面东西就非常多了,有目标IP地址的目标端口信息,还有我们要发送的数据等等很多东西,也就是TCP的报文段,具体有些啥下面我会说到。
说完这里以后我们再往上看,有个左边黄色右边蓝色的长方形,这个就是我们刚才说的TCP报文段,也就是我们刚才说的IP数据部分,它也分两个部分:TCP首部和TCP数据部分
TCP首部:
这个首部东西还挺多的,分别都有自己的功能,所以这个首部很像是功能性的内容,比如这个数据包给哪个端口啊,是用来做什么的之类的,下面会讲到。
TCP数据部分:
这部分实际上就是我们的数据部分,就是我们要传输的数据
现在再往上看,我们会发现上面这个大块黄色的其实就是下面的小块黄色的长方形,也就是我们的TCP首部,图中详细的画出了其各个部分,甚至还标出了其各个部分的大小,下面我仔细讲一下各个部分的功能和作用:
我们先竖着看,可以看到整个叫做TCP首部,前五行叫做20字节的固定首部,说明前五行一共是20字节,并且这五行内容格式是固定的。并且五行一共20字节,那么一行4字节,也就是32位,横着看发现最上方已经写出来了32位,也就是用于来标识下方各个区域的大小是多少的刻度。
然后我们从上往下一行一行的看:
第一行我们看到了两个端口,端口这个概念是计算机里面的一个很常见的概念,分为物理端口和虚拟端口。所谓物理端口,那肯定是实际存在的,就像是交换机上面那些接口们,虚拟端口就比较有意思了,它是一个虚拟的概念,不可见,存在于计算机内部,我们知道计算机运行时是有非常多进程的,我们的数据肯定是传递给特定的一个进程,那用什么来唯一确定这个进程呢?就用端口号即可。每个进程都有自己对应的端口号,计算机虚拟端口号是一个16位数,也就是说,计算机一共有2的16次方-1这么多个端口号可以使用,也就是65535个,在图中,两个端口分别占用16位,便是这个原因。下面是具体各个部分的功能和定义:
源端口:
源端口我们一看就知道是指发送方计算机发送数据的出来的那个端口号
目的端口:
目的端口同理,指的是接收方计算机所接收数据的那个端口号
序号(seq):
seq号,我们知道一个数据可能是由多个数据包组成,序号的作用就是来标识各个数据包的先后顺序,序号占用32bit,那么序号最多有2的32次方-1个,那假如超过了这个个数怎么办呢?就从0开始重新编号,这个seq号比较重要,后面的三次握手的内容需要用到
确认号(ack):
ack号,注意ack号和下面的ACK标识是不一样的,ack=seq+1时说明发送方和接收方配对成功了。这个确认号是数据接收方反馈给发送方的一个属性,假如确认号为N,那么表示接收方已经接收到了N-1及其以前的数据
接下来的第四行东西有点多,如下:
数据偏移:
这个数据偏移是针对TCP报文段来说的,指的是从TCP报文段到TCP数据部分之间的距离,也就是TCP首部的大小,一般来说是20个字节,但是我们从图中可以发现第六行有个可变长度,所以有的时候其不是20个字节。
保留:
保留表示现在没有被使用,这段长度是可以被使用的。
URG:
URG=1时表示此报文为紧急报文,所以这个报文优先级最高,会被发送方放到最开头传输,需配合我们下面要说到的紧急指针一起使用
ACK:
ACK是用来指明连接是否建立的属性,当ACK=1时说明连接已经建立了,建立连接后的所有报文ACK都必须为1,并且规定只有当ACK=1时确认号才会有效
PSH:
这个属性是用于一端的应用进程希望在键入一个命令后立即就能收到对方的响应时使用,TCP可进行推送操作
RST:
这个字段其实就是reset,当我们的TCP连接出现严重错误时,我们需要将连接进行重置,这时候需要释放连接,重新建立新的连接
SYN:
这个属性比较重要,当它等于1时用于表示此报文为连接请求或者连接接受报文,当SYN=1且ACK=0时,那就说明此时是连接请求报文。当SYN=1且ACK=1时,说明此时是连接接受报文,并且当SYN=1时是不允许携带数据的,并且会消耗一个序号。
FIN:
此属性用于释放连接,是finnish的缩写,当发送方将FIN置1时,说明数据已经完全发送完毕,要求释放连接
窗口:
窗口是用来控制传输速率的属性,它表示接收方允许对方发送的数据量,来解决带宽不一致的问题
校验和:
用于校验首部和数据两部分
【计算机网络|TCP的报文详细解读】紧急指针:
当URG=1时,说明此报文为紧急报文,紧急指针指出本报文中紧急数据的字节数,紧急数据处理完毕TCP会告诉应用程序恢复正常工作,并且,窗口为0时也可以发送紧急数据
推荐阅读
- 笔记|计算机网络自顶向下 —— 阅读笔记
- 网络知识学习|从0开始的网络学习——IP、DNS、服务器
- 杂项|硬件工程师应具备的基础知识
- Linux从系统到网络|HTTP协议
- Linux从系统到网络|socket(套接字)实现udp通信
- p2p|JAVA学习(语言基础第一天)
- 分类|LeNet网络模型——CIFAR-10数据集进行分类
- 计算机网络|[计算机网络]二——计算机网络参考模型(分层模型和数据传输过程)、OSI七层、封装和解封装
- 网络|来自编程“老者”们的须时刻谨记的七大教训金典