TCP安全机制:
- 确认应答机制
- 超时重传机制
- 连接管理机制
- 流量控制
- 拥塞控制
TCP性能机制:
- 滑动窗口
- 延迟应答
- 捎带应答
滑动窗口(处于发送端):提高性能
- 窗口大小是指无需等待确认应答而可以继续发送数据的最大值,例如窗口大小是4000个字节(4个段)
- ACK响应报文中,携带的下一个序号表示在此序号之前所有数据都以接收到
- 发送前4个段时,不需要等待任何ACK,直接发送
- 收到第一个ACK后,滑动窗口向后移动,继续发送第五个数据,以此类推
- 操作系统内核为维护这个滑动窗口,需要开辟发送缓冲区来记录当前还有那些没有应答,只有确认应答过的数据,才能从缓冲区删掉
- 窗口越大,网络的吞吐率越高
窗口滑动:依赖ACK响应报文中的下一个序号进行滑动,而下一个序号又依赖于接收到的连续报文的最大序号相对来说,就是在这种情况之下
如果发生丢包,如何进行重传,有以下两种情况:
情况1: 数据包已抵达,ACK丢了。情况不严重,通过后续的ACK响应进行确认即可
情况2: 数据包直接丢了
1.当一段报文丢失时,发送端会一直收到1001这样的ACK响应
2.如果发送端主机连续三次收到“1001”的应答,那么就会重新发送对应数据1001-2000
3.这时候接收端收到1001之后,再次返回的ACK就是7001(因为2001-7000)接收端之前已经收到了,被放到接收端操作系统内核的接收缓冲区中
也被称为"高速重发控制"(快重传)
流量控制:
流量控制:接收端处理数据的速度有限,如果发送端发送太快,导致接收端的缓冲区占满,这时候发送端如果继续发送,会造成丢包,会引起丢包重传等一系列连锁反应。因此TCP支持根据接收端的处理能力,来决定发送端的发送速度
- 接收端将自己可以接受的缓冲区大小放入TCP首部中的“窗口大小”字段,通过ACK通知发送端
- 窗口大小字段越大,说明网络的吞吐量越大
- 接收端一旦发现自己的缓冲区快满了,就会将窗口大小设置成一个更小的值通知给发送端
- 接收端一旦接受到这个窗口之后,就会减慢自己的发送速度
- 如果接收端缓冲区快满了,就会将窗口置为0,这时发送方不再发送数据,但是需要定期发送一个窗口探测数据段,使接收端把窗口大小告诉发送端
- 接收端将窗口大小告诉发送端:TCP首部中有一个16位窗口字段,存放了窗口大小的信息(TCP首部40字节选项中还包含了一个窗口扩大因子M,实际窗口大小是窗口字段的值左移M位)
堵塞控制:
原理: 拥塞窗口设置为1,以慢启动指数级增长的方式,达到一定阈值转变为线性增长的方式
可能出现问题的原因:
1.虽然滑动窗口能高效可靠发送大量数据,但如果在刚开始阶段就发送大量数据,仍然会出现问题
2.因为网络上有很多计算机,可能当前网络状态就比较拥堵,在不清除当前网络情况下,就发送大量数据,仍然会出现问题
3.TCP引入慢启动 机制,先发送少量数据,探探当前网络的拥堵状况,再按需使用多大速度传输数据
- “慢启动”: 发送开始时,定义阻塞窗口大小为1,每次收到一个ACK应答,拥塞窗口加1;每次发送数据包时,将拥塞窗口和接收端主机反馈的窗口带线啊哦作比较,取较小的值作为实际发送的窗口。拥塞窗口增长呈指数级增长。初始时慢,但增长速度极快。
- 慢启动的阈值: 为了不增长那么快,因此不能简单地窗口加倍.当拥塞窗口超过这个阈值时,不再按照指数方式增长,按照线性方式增长。当TCP开始启动时,慢启动阈值等于窗口最大值;
- 在每次超时重发时,慢启动阈值会变成原来的一半,同时拥塞窗口置回1
少量丢包,仅仅触发超时重传;当大量丢包时,就会是网络拥塞。 - 当TCP通信开始后,网络吞吐量逐渐上升,随着网络发生拥堵,吞吐量会立即下降。
- 拥塞控制是TCP协议想尽可能快的将数据传输给对方,但又避免给网络造成过大压力的折中方案
延迟应答:
原理: 接收到多个数据报时,不针对每条数据报响应ACK,而是延迟一定时间,接收缓冲区数据很快被处理,可用空间更大,返回的窗口大小字段就可以设置更大,使得网络吞吐量更大,传输效率更高
延迟依据: 数量.时间 都是由系统决定
数量限制:每隔N个包就应答一次
时间限制:超过最大延迟时间就应答一次
如果接收数据的主机立刻返回ACK应答,这时返回的的窗口可能较小
- 假设接收端缓冲区为1M,一次收到了500k的数据,返回的窗口就是500k
- 但处理端处理数据时间极短,10ms之内就把500k数据从缓冲区消费掉了
- 在这种情况下,接收端处理还远没有达到自己极限,即使窗口再放大一些也能完成数据处理
- 如果接收端等一会再应答,那么这是返回的窗口大小就是1M。窗口越大,吞吐率越大,数据传输效率就越高
捎带应答:
在延迟应答基础上,客户端服务器在应用层一发一收,此时ACK响应可以与服务器回应的数据一起发回给客户端
面向字节流:
创建一个TCP的socket,同时在内核创建一个发送缓冲区和一个接收缓冲区
- 调用write时,数据回先写入发送缓冲区中
- 如果发送的字节数太长,会被拆成多个TCP数据包发出
- 如果发送字节数太短,就会先在缓冲区等待,等到缓冲区中的长度差不多,或寻找其他合适时机发送
- 接受数据时,数据也是从网卡驱动程序到达内核的接收缓冲区,然后应用程序调用read从接收缓冲区取数据
- 但TCP中存在一种连接,既有发送缓冲区,又有接收缓冲区,因此该连接既可以写数据也可以读取数据全双工
粘包问题
解决方法: 明确两个包之间的边界(实现应用层中用户程序使用协议对数据进行解析/格式化)
UDP不存在粘包问题
心跳检测机制:分布式项目,集群
(类似再应用层中实现类似TCP超时重传机制的功能,目的是判断双方连接是否还存活)客户端与服务端,服务端于服务端也可以建立连接,并使用心跳检测机制
定时发送心跳包(内容自定)
TCP异常情况:
- 进程终止:进程终止会释放文件描述符,仍可以发送FIN,与正常关闭无区别
- 机器重启:与进程终止情况相同
- 机器掉电/网线断开:接收端认为连接还在,一旦接收端有数据写入,接收端发现链接已经断开,就会进行reset,即使没有写入操作,TCP也内置了一个保活定时器,会定期询问对方是都存在,如果不存在,就会将连接释放
数据链路层:
- "以太网"不是具体的网络,而是一种技术标准;既包含了数据链路层的内容,也包含了一些物理层的内容(规定网络拓扑结构,访问控制方式,传输速率等)
- 以太网中的网线必须使用双绞线,传输速率有10M,100M等
- 以太网是当前应用最广泛的局域网技术,和以太网并列的还有令牌环网,无线LAN等
以太网帧格式: - 源地址和目的地址是指网卡的硬件地址(MAC地址),长度是48位,在网卡出厂时固化的
MAC地址
- MAC地址用来识别数据链路层中相连的节点
- 长度为48位,6个字节.一般用16进制以及冒号来表示
- 在网卡出厂时确定,不能修改,MAC地址通常是唯一的(虚拟机中的MAC地址不是真正的MAC地址,可能会产生冲突;也有些网卡支持用户配置MAC地址)
MTU
MTU相当于发快递时对包裹大小的限制,这个限制是不同的数据链路对应的物理层产生的限制
- 以太网帧中的数据长度规定最小46字节,最大1500字节,ARP数据包的长度不够46字节,要在后面补填充位
- 最大值1500称为以太网的最大传输单元(MTU),不同网络类型有不同的MTU
- 如果一个数据包,从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU,则需要对数据包进行分片
- 不同的数据链路层标准的MTU是不同的
数据封装,到数据链路层时,会根据MTU协议进行分片/拆包发送