消息传输的核心要素
寄件人与收件人信息
• IP 地址
• TCP(UDP)端口
• HTTP Host/URI 等
物流订单号
• IP 序列号
• TCP 序列号
物流系统需求
在快递单中,有三类的主要的信息,第一类是寄件人和收件人信息,第二类物流有订单号,第三类物流系统需求,也就是里面放了什么东西,是电子产品还是文件。
要发给谁能,这就是ip地址,就好比邮寄到那个市,到了对方主机之后,对方主机有很多的进程,每个进程监听着不同的端口,通过端口来确定是哪个进程需要处理消息,再进一步还要看进程可能是web server,需要根据host 域名,不同的域名交由不同的代码段去处理,不同的url交由不同的功能模块去处理。最后这就确定的寄件人和收件人是谁。
Sequence 序列号/Ack 序列号
设计目的:解决应用层字节流的可靠发送
- 跟踪应用层的发送端数据是否送达
- 确定接收端有序的接收到字节流
序列号的值针对的是字节而不是报文
确认序号
有个序列号和确认号,它们都是4个字节,当使用确认报文的时候,要将标记位ACK置为1,窗口大小就是相对于limit,告诉它我还能接受多少个字节。
在这条消息当中,seq number是相对的,值为569,tcp的长度是1328,所以下一条消息就是569+1328=1897发起的。
然后有发了一条消息,发了有个get请求,这个get请求时从1827开始发,发了845字节,所以下一次将从2742开始发。
TCP 序列号
发送大概4G多字节之后,如果连接继续使用的话,那么就需要复用之前的seq。
TCP报文的首部格式
源端口和目的端口各占2个字节,分别写入源端口号和目的端口号。和UDP一样,使用端口号标识不同的应用层协议
TCP的首部是变长的,其中有20个字节是固定的,一行有4个字节,源端口和目标端口分别占用2个字节,全部为1的话,那么取值是65535,也就是端口号最大是65535。
序号占4字节。序号范围是[0,232-1],共232(即4 294 967 296)个序号,首部中的序号字段值则指的是本报文段所发送的数据的第一个字节的序号。
A计算机向B计算机传文件,传文件那么文件就写到缓存里面,在缓存里面的字节就开始分段,比如1-100个字节分为一段,101-200又是一段,每段里面都有100个字节,然后就会将TCP首部的序号指明这个段里面的第一个数据是整个文件第多少个字节。
序号seq(缓存中排序)
如果是整个文件第一个字节那么就是1,第二段是整个文件第101个字节,你们可以看到序号是101,也就是使用tcp的序号来标识里面字节的顺序。
接收端收到之后,这样这两个段就会按照顺序排列好。用序号标识字节的顺序。
确认号ack(保证数据的可达性)
建立了TCP连接之后,B计算机也可以向A计算机发送数据,B收到了两个包之后发确认的话,他就发送只有TCP首部的数据包,这个数据包没有数据,这个确认号是201,当A确认收到201之后,A计算机就知道该发201以及之后的字节,可以看到确认号是告诉A计算机该发第多少个字节了。
确认号是接收端告诉发送端该发第多少个字节了。
如果序号都是1的话,那么是4G,也就是计算机传文件的时候,文件超出4G了,那么这个序号可能又要从0又开始。
如果A和B同时传文件,这个时候发确认号的时候,就不需要单独发确认号了,而是B给A传数据的时候顺便就告诉A计算机了该发第多少个,不用单独产生数据包。
TCP 协议的任务
- 主机内的进程寻址(主要基于端口)
- 创建、管理、终止连接(因为面向连接的,所以必须管理连接)
- 处理并将字节(8bit)流打包成报文段(如 IP 报文)
- 传输数据
- 保持可靠性与传输质量
- 流控制(面向接受和发送方这两端,防止处理的速度不匹配)与 拥塞控制(面向整个网络,防止网络出现恶性拥塞)
如何标识一个连接?
既然tcp是面向连接的协议,那么如何标识一个tcp连接呢?
tcp通过四元组,来唯一的定义一个连接,理论上tcp连接数可以达到如下所示,32是地址,16是端口0-65535。
TCP报文的首部格式
源端口和目的端口分别是指发送方应用程序的端口和目的方应用程序的端口号。
序号是指在一个TCP连接中传送的字节流中的每一个字节都按顺序编号,本字段表示本报文段所发送数据的第一个字节的序号。
确认号是指期望收到对方下一个报文段的第一个数据字节的序号。若确认号位N,则证明到需要N-1为止所有的数据都已经正确收到。如下图,我们举例说明一下
接收方收到了1,2,3个字节组成的数据包,然后接收方就会发送一个确认报文给发送方,其中确认报文的确认号就应该是4,因为1,2,3这三个字节的组成的数据包已经收到了。
- 数据偏移指的是TCP报文段的数据起始处举例TCP报文段的起始处有多远。
- 6个控制位介绍如下
| 控制位 | **作用** |
| ------ | :----------------------------------------------------------- |
| ACK | 置1时表示确认号合法,为0的时候表示数据段不包含确认信息,确认号被忽略 |
| PSH | 置1时请求的数据段在接收方得到后就可直接送到应用程序,而不必等到缓冲区满时才传送 |
| RST | 置1时重建连接。如果接收到RST位时候,通常发生了某些错 |
| SYN | 置1时用来发起一个连接 |
| FIN | 置1时表示发端完成发送任务。用来释放连接,表明发送方已经没有数据发送了 |
| URG | 紧急指针,告诉接收TCP模块紧要指针域指着紧要数据 |
TCP常规报文段的长度为20个字节,20个字节之后还要tcp选项,这是一个可选的数据。
抓包看看
首先tcp报文有一个源端口和目标端口
接下来就sequence number,0为相对的sequence number。