
文章插图
上图可以看出TCP传输是如何面向字节流的,具体细节后面继续解析:
TCP连接基于Socket:
- TCP 把连接作为最基本的抽象,每一条 TCP 连接有两个端点;
- TCP 连接的端点不是主机,不是主机的IP 地址,不是应用进程,也不是传输层的协议端口 。TCP 连接的端点叫做套接字(socket);
- IP地址+服务端口构成了套接字 。

文章插图
TCP协议确保可靠传输
TCP使用自动重传请求ARQ (Automatic Repeat reQuest)确保可靠传输;
停止等待机制:

文章插图
报文过不了检验的,被B丢弃,A发送发出去的报文无回应、重新发送 。
请注意:
- 在发送完一个分组后,必须暂时保留已发送的分组的副本,方便重传;
- 分组和确认分组都必须进行编号;
- 超时计时器的重传时间应当比数据在分组传输的平均往返时间更长一些 。

文章插图
- 确认丢失机制将超时的包覆盖为超时重传的包 。
ARQ 表明重传的请求是自动进行的 。
TCP流水线传输:停止等待协议的优点是简单,但缺点是信道利用率太低 。
改进:
发送方可连续发送多个分组,不必每发完一个分组就停顿下来等待对方的确认,由于信道上一直有数据不间断地传送,这种传输方式可获得很高的信道利用率 。

文章插图
连续 ARQ 协议(自动重传协议):连续ARQ(AutomaticRepeat reQuest)协议指发送方维持着一个一定大小的发送窗口,位于发送窗口内的所有分组都可连续发送出去,而中途不需要等待对方的确认 。这样信道的利用率就提高了 。而发送方每收到一个确认就把发送窗口向前滑动一个分组的位置;

文章插图
接收方一般都是采用积累确认的方式 。这就是说,接收方不必对收到的分组逐个发送确认,而是在收到几个分组后,对按序到达的最后一个分组发送确认,这就表示:到这个分组为止的所有分组都已正确收到了;
积累确认有优点也有缺点 。优点是:容易实现,即使确认丢失也不必重传 。但缺点是不能向发送方反映出接收方已经正确收到的所有分组的信息;
例如,如果发送方发送了前5个分组,而中间的第3个分组丢失了 。这时接收方只是对前两个分组发出确认 。发送方无法知道后面三个分组的下落,而只好把后面的三个分组都再重传一次 。这就叫做Go-back-N(回退N),表示需要再退回来重传已发送过的N个分组 。可见当通信线路质量不好时,连续ARQ协议会带来负面的影响 。
TCP 报文段的首部格式:

文章插图
- 源端口和目的端口字段各占 2 字节(16位),源端口指发送端相关服务端口,目的端口是目标主机相关服务,端口是传输层与应用层的服务接口,传输层的复用和分用功能都要通过端口才能实现 。
- 序号:当前数据组的第一个字节在整个文件中的序号 。
- 确认号ack:接收端发送,提示发送端下一次该发的数据在整个文件中的序号(收发连续的话就是序号+1),接收端收到后,会把这个序号之前的数据从缓存中删掉 。
- 数据偏移:指明当前TCP报文段第多少个字节后是TCP的数据部分了,数据偏移最多表示1111,即15,他最多可以表示15乘以4,即60个字节的偏移量,所以选项+填充最多只能是40个字节 。
- 保留:就是保留,没有用的 。
- URG:urgent,意思是优先级高,发送端优先发送,而不是在缓存中排队 。
- ACK:acknowledge,1意味着确认正式建立了会话 。
- PSH:1意味着接收端优先读取,而不是在缓存中排队 。
- RST:reset,1意味着TCP会话出现严重错误,必须释放和重新连接,比如你打开网页又立马将之关掉了,那么接收方也不用再给你传输网页信息了 。
推荐阅读
- Mysql写入频繁,怎么破?这是我见过的最清晰的“神操作”
- 又一个骚操作,查询Windows Defender的白名单路径
- 我最喜欢用的 5 个 Ansible 模块
- 华安解密之DDoS攻防 21 引流回注的成败之谜
- 持续整理PyCharm的一些小用法
- CentOS7下重置root密码的操作步骤
- 淘宝团长是怎么推广的 找淘宝客推广有用吗
- 架构的腐化是必然的
- PS教程:制作霓虹灯字效果,开启斑斓的夜晚
- 如何远程开启你的电脑:WoL的原理和陷阱
