负责数据能够从发送端传输接收端
TCP协议
TCP,即Transmission Control Protocol,传输控制协议。要对数据的传输进行一个详细的控制
TCP协议端格式
0 16 | 32 | |||||||
16位源端口号 | 16位目的端口号 | |||||||
32位序号 | ||||||||
32位确认号 | ||||||||
4位 首部长度 | 保留 (6位) | U R G | A C K | P S H | S Y N | F I N | 16窗口大小 | |
16位校验和 | 16位紧急指针 | |||||||
选项 | ||||||||
数据 |
- 源/目的端口号:表示数据是从哪个进程来,到哪个进程去;
- 32位序号/32位确认号:
- 32位序号:报文端中第一个数据字节在字节流中的位置编号
- 32位确认号:期望从对方收到的下一个字节的序号;累计应答
- 4位TCP报头长度:表示该TCP头部有多少个32位bit(有多少个4字节);所以TCP头部最大长度是 15 * 4 = 60
- 6位标志位: 0/1
- URG:紧急指针是否有效
- ACK:确认号是否有效
- PSH:提示接收端应用程序立刻从TCP缓冲区把数据读走
- RST:对方要求重新建立连接;我们把携带RST标识的称为复位报文段
- SYN:请求建立连接;我们把携带SYN标识的称为同步报文段
- FIN:通知对方,本端要关闭了,我们称携带FIN标识的为结束报文段
- 16位窗口大小:流量窗口大小
- 16位校验和:发送端填充,CRC校验,负责验证数据完整性。
- 接收端校验不通过,则认为数据有问题。
- 此处的检验和不光 包含TCP首部,也包含TCP数据部分。
- 16位紧急指针:标识哪部分数据是紧急数据;
- 40字节头部选项:暂时忽略;
TCP原理:
TCP数据传输,安全和效率
保证可靠安全的前提下,尽量提高效率
安全机制
确认应答机制(安全机制)
说明:发送的数据,接收端需要返回确认接受到数据报的应答
发送端发送数据:
使用32位序列号,保存;
接受端应答:
ACK:确认应答,标记为1
32位确认号:下次期望接受的数据序列号(同时表明之前的报文已全部接受)
超时重传机制(安全机制)
说明:发送端超过一定时限,没有接收到ACK应答包,进行重传;
没有接收的两种情况:
- 数据报丢失;接收端没有接收到数据
- 发送端重新发送
- ack应答包丢失;接收端接收到数据
- 发送端重新发送,接收端接收到许多重复数据;
- TCP协议通过序列号,识别重复包,并丢弃;
一定时限:
应答时间受网络环境影响
超时时间过长,影响重传效率
超时时间过短,频发发送重复包(传输效率不高)
动态计算最大超时时间——指数增长,累计一定重传次数,强制关闭连接
- Linux中(BSD Unix和Windows也是如此),超时以500ms为一个单位进行控制,每次判定 超时重发的超时时间都是500ms的整数倍。
- 如果重发一次之后,仍然得不到应答,等待 2*500ms 后再进行重传
- 如果仍然得不到应答,等待 4*500ms 进行重传。依次类推,以指数形式递增。
- 累计到一定的重传次数,TCP认为网络或者对端主机出现异常,强制关闭连接。
连接管理机制(安全机制)
建立连接(三次握手)
建立连接:本质是双方保存一个连接状态
1.客户端发送syn(建立连接请求)
申请建立客户端到服务端的连接
2.服务端返回syn+ack
ack:对客户端发送syn的应答
syn:申请建立服务端到客户端的连接
3.客户端返回ack
对服务端syn的应答
断开连接:四次挥手
1.客户端发送fin到服务端
申请关闭客户端到服务端的连接
2.服务端返回ack
服务端转改置为 close_wait(进程通知高层应用进程)
3.服务端发送fin到客户端
申请关闭服务端到客户端的连接
客户端收到后,状态置为time_wait
4.客户端接返回ack
服务端状态置为closed(已关闭)
客户端等待一定时间,状态置为closed
滑动窗口(效率机制)
以并行的方式发送数据包,减少等待时间(叠加多个段的等待时间),提高数据传输效率
窗口大小
指无需等待确认应答,可以继续发送数据的最大值
滑动窗口大小 = min(流量窗口,拥塞窗口大小)
窗口越大,则网络的吞吐率就越高;
数据都保存在缓冲区
发送端保存在发送缓冲区;可能需要重传
接受端保存在接受缓冲区;可能需要去重
发生丢报
数据报抵达,ack丢失
可以通过后续的ack确认
数据报丢失
- 当数据报丢失,接受端会重复发送同一确认号的ack;
- 若发送端重复接收到三次同样确认号的ack,就会将相应的数据重新发送;(高速重发控制-快重传)
- 接受端接收到重发的数据后,将其按序号,放入接收缓冲区,并发送下一确认号
流量控制(安全机制)
TCP支持根据接收端的处理能力,来决定发送端的发送速度。这个机制就叫做流量控制(Flow Control)
接收端处理数据速度有限。
若发送端发的太快,导致接收端的缓冲区被打满,发送端持续发送就会造成丢包;
丢包引发重传等一系列反应;
理解:
- 接收端接受数据能力有限,将自身接收缓冲区剩余大小,放入TCP首部窗口大小部分,通过ack报通知发送端;
- 发送端接收后,根据窗口大小,结合自身阻塞窗口,控制数据发送速度;
- 若窗口大小为0,发送不会发送数据,但会定期发送窗口探测数据报,让接收端告知窗口大小
实际上,TCP首部40字节选项中还包含了一个窗口扩大因子M,实际窗口大小是 窗口字段的值左移 M 位
拥塞控制(安全地址)
网络状态不明情况,贸然发送大量数据,可能会造成网络阻塞;
慢启动机制
先发少量数据,探明网络环境;之后根据环境决定传输速度;(动态变化)
通过阻塞窗口实现
慢启动:初始慢,增长速度快(指数型)
到达阈值后,线性增长;
- 当TCP开始启动的时候,慢启动阈值等于窗口(阻塞窗口)最大值(上次);
- 在每次超时重发的时候,慢启动阈值会变成原来的一半,同时拥塞窗口置回1;
少量的丢包,我们仅仅是触发超时重传;
大量的丢包,我们就认为网络拥塞;
TCP通信开始,网络吞吐率(滑动窗口决定)逐渐上升,一旦网络阻塞,吞吐下降(阻塞窗口下降)
延迟应答(效率机制)
滑动窗口大小决定吞吐率,min(阻塞,流量)
接受端返回流量窗口代表接收缓冲区的可用空间大小;
接受端处理数据速度可能较快,数据处理后,缓冲区大小变大,此时返回流量窗口可能更大,滑动窗口可能更大,吞吐率可能更大!
所有包都可以延迟应答?
- 数量限制:每隔N个包就应答一次;
- 时间限制:超过最大延迟时间就应答一次;
捎带应答(效率机制)
客户端或服务端,每一端,都可发送接收数据
可以将ack应答包(接收端)同发送的数据报(发送端)合并一同发送给对方
其他特性:面向字节流
其他特性:缓冲区
全双工:对于一个连接,可读可写;
由于缓冲区,tcp程序的读写,可多次执行;
写100个字节数据时,可以调用一次write写100个字节,也可以调用100次write,每次写一 个字节;
读100个字节数据时,也完全不需要考虑写的时候是怎么写的,既可以一次read 100个字 节,也可以一次read一个字节,重复100次;
其他特性:无大小限制(针对运输层)
粘包问题(包:指应用层的数据包)
应用层需要约定统一协议:明确包与包之间的边界;
无明确边界:
传输层:若基于TCP协议(面向字节流,一直收发数据,按照序号放在缓冲区中)
应用层:只是一连串的字节数据,无法得知完整的应用层数据包
明确两个包之间的边界:
1.固定大小的包:读写按照固定的大小读写
2.变长的包:
a:在包头位置,约定包的总长度字段,可以获知包的结束位置
b:约定包和包之间的分割符(不与数据信息冲突即可)
UDP不存在粘包问题
面向数据报,整块接收,整块发送;
本身具有明确边界;
若向上层交付数据,报文长度任然存在;
基于TCP应用层协议
http
https
ssh:Linux
Telnet:远程控制协议
FTP:文件传输
SMTP:邮件传输
UDP协议
UDP协议端格式
0 15 | 16 31 | |
16位源端口号 | 16位目的端口号 | 8 字 节 |
16位UDP长度 | 16位UDP检验和 | |
数据(若存在) |
UDP特性
无连接;
知道(目的)IP,(目的)端口号,直接进行传输,无需连接
不可靠
只负责发送数据;
没有任何安全机制,是否接收不保证
面向数据报
缓冲区
UDP的socket既能读,也能写,这个概念叫做 全双工
大小受限
UDP协议首部中有一个16位的最大长度。一个UDP能传输的数据最大长度是64K(包含UDP首 部)
适用场景
实时性要求高,允许少量丢包
基于UDP的应用层协议
NFS:网络文件系统(几乎无人使用)
TFTP:简单文件传输协议
DHCP:动态主机配置协议
BOOTP:启动协议(用于无盘设备启动)
DNS:域名解析协议