网站建设的目的定位盈利模式和功能,wordpress分类归档不科学,网站建设详细方案,wordpress 4.7 静态化前言
大家好#xff01;我是小帅#xff0c;今天我们来学习TCP协议#xff0c;个人主页 文章目录 1. TCP协议2. TCP的核心机制2.1TCP核心机制一#xff1a;确认应答2.2 TCP核心机制二#xff1a;超时重传2.3 TCP核心机制三#xff1a;连接管理2.4 TCP核心机制四#xf…前言
大家好我是小帅今天我们来学习TCP协议个人主页 文章目录 1. TCP协议2. TCP的核心机制2.1TCP核心机制一确认应答2.2 TCP核心机制二超时重传2.3 TCP核心机制三连接管理2.4 TCP核心机制四滑动窗口2.5TCP核心机制五快速重传2.6 TCP核心机制六流量控制2.7 TCP核心机制七拥塞控制2.8 TCP核心机制八延迟应答2.9 TCP核心机制九捎带应答2.10 TCP核心机制十⾯向字节流2.11 异常情况 3. TCP 协议⼩结 1. TCP协议
TCP全称为 “传输控制协议(Transmission Control Protocol”). ⼈如其名, 要对数据的传输进⾏⼀个详细的控制;
TCP协议段格式 封装到网络层
端口号 16位源端口发送方主机的应用程序的端口号 16位目的端口目的主机的应用程序的端口号 序列号 32位TCP序列号表示本报文段所发送数据的第一个字节的编号 确认序号 32位TCP确认序号接收方期望收到发送方下一个报文段的第一个字节数据的编号 首部长度 4位TCP首部长度数据偏移是指数据段中的“数据”部分起始处距离TCP报文段起始处的字节偏移量。确定TCP报文的报头部分长度告诉接收端应用程序数据(有效载荷)从何处开始 保留(6位) 6位保留字段为TCP将来的发展预留空间目前必须全部为0 标志位字段 6位标志位共有6个标志位每个标志位占1个bit 标志作用URG表示本报文中发送的数据(有效载荷)是否包含紧急数据URG1时表示有紧急数据当URG1时后续的16位紧急指针字段才有效ACK表示本报文前面的确认号字段是否有效只有当ACK1时前面的确认号字段才有效TCP规定建立连接后ACK必须为1PSH告诉对方收到该报文段后上层应用程序立即把数据从TCP接收缓冲区读取保证TCP接收缓冲区有能力接收新数据或清空TCP接收缓冲区RST表示是否重置连接若RST1说明TCP连接出现严重错误(如主机崩溃)必须释放连接重新建立连接。携带RST标识的报文称为复位报文段SYN在建立连接时使用用来同步序号当SYN1ACK0时表示该报文为请求建立连接的报文当SYN1ACK1时表示同意建立连接只有在建立连接的前两次请求中SYN才为1。该报文称为同步报文段FIN标记数据是否发送完毕若FIN1表示数据已经发送完毕可以释放连接。该报文称为结束报文段
窗口大小 16位窗口大小表示发送该TCP报文的接受窗口还可以接受多少字节的数据量。该字段用于TCP的流量控制 校验和 16位校验和字段用于确认传输的数据有无损坏 。发送端基于数据内容校验生成一个数值接收端根据接受的数据校验生成一个值。两个值相同代表数据有效反之无效丢弃该数据包。校验和根据 伪报头 TCP头 TCP数据 三部分进行计算 9.紧急指针 16位紧急指针字段 仅当标志位字段的URG标志位为1时才有意义。指出有效载荷中为紧急数据的字节数。当所有紧急数据处理完后TCP就会告诉应用程序恢复到正常操作。即使接收方窗口大小为0也可以发送紧急数据因为紧急数据无须缓存。 上面可能有点难理解特别是6个标志位下面我们讲解TCP的机制你可能就会了解了。
2. TCP的核心机制 2.1TCP核心机制一确认应答 TCP将每个字节的数据都进⾏了编号. 即为序列号. 每⼀个ACK都带有对应的确认序列号 意思是告诉发送者, 我已经收到了哪些数据; 下⼀次你从哪⾥开始 发。 2.2 TCP核心机制二超时重传
主机A发送数据给B之后, 可能因为⽹络拥堵等原因, 数据⽆法到达主机B; 主机A未收到B发来的确认应答, 也可能是因为ACK丢失了; 如图
如果主机A在⼀个特定时间间隔内没有收到B发来的确认应答, 就会进⾏重发 如图 标志位ACK解释 因此主机B会收到很多重复数据. 那么TCP协议需要能够识别出那些包是重复的包, 并且把重复的丢弃掉.
超时的时间如何确定? 这个时间的⻓短, 随着⽹络环境的不同, 是有差异的如果超时时间设的太⻓, 会影响整体的重传效率; 如果超时时间设的太短, 有可能会频繁发送重复的包。
TCP为了保证⽆论在任何环境下都能⽐较⾼性能的通信, 因此会动态计算这个最⼤超时时间. Linux中(BSD Unix和Windows也是如此), 超时以500ms为⼀个单位进⾏控制, 每次判定超时重发的超时时间都是500ms的整数倍.如果重发⼀次之后, 仍然得不到应答, 等待 2*500ms 后再进⾏重传.如果仍然得不到应答, 等待 4*500ms 进⾏重传. 依次类推, 以指数形式递增.累计到⼀定的重传次数, TCP认为⽹络或者对端主机出现异常, 强制关闭连接. 2.3 TCP核心机制三连接管理
在正常情况下, TCP要经过三次握⼿建⽴连接, 四次挥⼿断开连接.
三次握⼿建⽴连接 SYN标志位的解释
四次挥手断开连接 FIN标志位的解释 表示数据已经发送完毕可以释放连接。 3次握手4挥手的4个状态 最后一手防丢包 对于四次挥手 ACK是操作系统内核实现的但是FIN的触发是通过应用程序调用close实现的。
对于三次握手中的SYNACK是在操作系统内核负责的时机是在收到SYN后和并发送。
TCP三次握手的原因 1. 投石问路验证通信链路是否通畅 2. 验证双方发送和接收能力是否正常。 3. 传递信息比如说TCP连接中的起始序号。 图片总结 2.4 TCP核心机制四滑动窗口
刚才我们讨论了确认应答策略, 对每⼀个发送的数据段, 都要给⼀个ACK确认应答. 收到ACK后再发送下 ⼀个数据段. 这样做有⼀个⽐较⼤的缺点, 就是性能较差. 尤其是数据往返的时间较⻓的时候.
既然这样⼀发⼀收的⽅式性能较低, 那么我们⼀次发送多条数据, 就可以⼤⼤的提⾼性能(其实是将多个 段的等待时间重叠在⼀起了) 窗⼝⼤⼩指的是⽆需等待确认应答⽽可以继续发送数据的最⼤值. 比如上面图片的窗⼝⼤⼩就是4000个字节 (四个段). 发送前四个段的时候, 不需要等待任何ACK, 直接发送;
收到第⼀个ACK后, 滑动窗⼝向后移动, 继续发送第五个段的数据; 依次类推;
操作系统内核为了维护这个滑动窗⼝, 需要开辟 发送缓冲区 来记录当前还有哪些数据没有应答; 只 有确认应答过的数据, 才能从缓冲区删掉。
窗⼝越⼤, 则⽹络的吞吐率就越⾼。 2.5TCP核心机制五快速重传
两种情况 情况一: 数据包就直接丢了 解释 当某⼀段报⽂段丢失之后, 发送端会⼀直收到 1001 这样的ACK, 就像是在提醒发送端 “我想要的是1001” ⼀样; 如果发送端主机连续三次收到了同样⼀个 “1001” 这样的应答, 就会将对应的数据 1001 - 2000 重新发送; 这个时候接收端收到了 1001 之后, 再次返回的ACK就是7001了(因为2001 - 7000)接收端其实之前就已经收到了, 被放到了接收端操作系统内核的接收缓冲区中;
情况二数据包已经抵达, ACK被丢了 这种情况下, 部分ACK丢了并不要紧, 因为可以通过后续的ACK进⾏确认; 2.6 TCP核心机制六流量控制
根据接送端的接收能力反向制约发送端的发送速度。
接收端处理数据的速度是有限的. 如果发送端发的太快, 导致接收端的缓冲区被打满, 这个时候如果发送端继续发送, 就会造成丢包, 继⽽引起丢包重传等等⼀系列连锁反应.
因此TCP⽀持根据接收端的处理能⼒, 来决定发送端的发送速度. 这个机制就叫做流量控制。
接收端将⾃⼰可以接收的缓冲区⼤⼩放⼊ TCP ⾸部中的 “16位窗⼝⼤⼩” 字段, 通过ACK端通知发送端; 发送的窗口大小 窗口大小 窗口扩展因子 窗⼝⼤⼩字段越⼤, 说明⽹络的吞吐量越⾼;接收端⼀旦发现⾃⼰的缓冲区快满了, 就会将窗⼝⼤⼩设置成⼀个更⼩的值通知给发送端;发送端接受到这个窗⼝之后, 就会减慢⾃⼰的发送速度;如果接收端缓冲区满了, 就会将窗⼝置为0; 这时发送⽅不再发送数据, 但是需要定期发送⼀个窗⼝探测数据段, 使接收端把窗⼝⼤⼩告诉发送端.
如图 2.7 TCP核心机制七拥塞控制
虽然TCP有了滑动窗⼝这个⼤杀器, 能够⾼效可靠的发送⼤量的数据. 但是如果在刚开始阶段就发送⼤量的数据, 仍然可能引发问题。
因为⽹络上有很多的计算机, 可能当前的⽹络状态就已经⽐较拥堵. 在不清楚当前⽹络状态下, 贸然发送⼤量的数据, 是很有可能引起雪上加霜的.
所以数据的传输由流量控制和拥塞控制两个因素共同制约取两个的较小值作为实际的发送速度。
TCP引⼊ 慢启动 机制, 先发少量的数据, 探探路, 摸清当前的⽹络拥堵状态, 再决定按照多⼤的速度传数据;
如图
这样的拥塞窗⼝增⻓速度, 是指数级别的. “慢启动” 只是指初使时慢, 但是增⻓速度⾮常快.
为了不增⻓的那么快, 因此不能使拥塞窗⼝单纯的加倍.此处引⼊⼀个叫做慢启动的阈值当拥塞窗⼝超过这个阈值的时候, 不再按照指数⽅式增⻓, ⽽是按照线性⽅式增⻓ 当TCP开始启动的时候, 慢启动阈值等于窗⼝最⼤值;
在每次超时重发的时候, 慢启动阈值会变成原来的⼀半, 同时拥塞窗⼝置回1; 少量的丢包, 我们仅仅是触发超时重传; ⼤量的丢包, 我们就认为⽹络拥塞; 当TCP通信开始后, ⽹络吞吐量会逐渐上升; 随着⽹络发⽣拥堵, 吞吐量会⽴刻下降;
直观图片 解释 2.8 TCP核心机制八延迟应答
提升效率的机制延迟应答 如果接收数据的主机⽴刻返回ACK应答, 这时候返回的窗⼝可能⽐较⼩.
假设接收端缓冲区为1M. ⼀次收到了500K的数据; 如果⽴刻应答, 返回的窗⼝就是500K;但实际上可能处理端处理的速度很快, 10ms之内就把500K数据从缓冲区消费掉了;在这种情况下, 接收端处理还远没有达到⾃⼰的极限, 即使窗⼝再放⼤⼀些, 也能处理过来;如果接收端稍微等⼀会再应答, ⽐如等待200ms再应答, 那么这个时候返回的窗⼝⼤⼩就是1M; ⼀定要记得, 窗⼝越⼤, ⽹络吞吐量就越⼤, 传输效率就越⾼. 我们的⽬标是在保证⽹络不拥塞的情况下尽量提⾼传输效率;
那么所有的包都可以延迟应答么? 肯定也不是; 数量限制: 每隔N个包就应答⼀次;数据包数量较多的情况 时间限制: 超过最⼤延迟时间就应答⼀次; 2.9 TCP核心机制九捎带应答
在延迟应答的基础上, 我们发现, 很多情况下, 客⼾端服务器在应⽤层也是 “⼀发⼀收” 的. 意味着客⼾端给服务器说了 “How are you”, 服务器也会给客⼾端回⼀个 “Fine, thank you”;
那么这个时候ACK就可以搭顺⻛⻋, 和服务器回应的 “Fine, thank you” ⼀起回给客⼾端。 提升数据传输的效率。
2.10 TCP核心机制十⾯向字节流
创建⼀个TCP的socket, 同时在内核中创建⼀个 发送缓冲区 和⼀个 接收缓冲区;
调⽤write时, 数据会先写⼊发送缓冲区中;如果发送的字节数太⻓, 会被拆分成多个TCP的数据包发出;如果发送的字节数太短, 就会先在缓冲区⾥等待, 等到缓冲区⻓度差不多了, 或者其他合适的时机发送出去;接收数据的时候, 数据也是从⽹卡驱动程序到达内核的接收缓冲区;然后应⽤程序可以调⽤read从接收缓冲区拿数据;另⼀⽅⾯, TCP的⼀个连接, 既有发送缓冲区, 也有接收缓冲区, 那么对于这⼀个连接, 既可以读数据,也可以写数据. 这个概念叫做 全双⼯.
由于缓冲区的存在, TCP程序的读和写不需要⼀⼀匹配 1. 写100个字节数据时, 可以调⽤⼀次write写100个字节, 也可以调⽤100次write, 每次写⼀个字节; 2. 读100个字节数据时, 也完全不需要考虑写的时候是怎么写的, 既可以⼀次read 100个字节, 也可以⼀次read⼀个字节, 重复100次; 粘包问题 ⾸先要明确, 粘包问题中的 包 , 是指的应⽤层的数据包.
在TCP的协议头中, 没有如同UDP⼀样的 “报⽂⻓度” 这样的字段, 但是有⼀个序号这样的字段.
站在传输层的⻆度, TCP是⼀个⼀个报⽂过来的. 按照序号排好序放在缓冲区中.站在应⽤层的⻆度, 看到的只是⼀串连续的字节数据.那么应⽤程序看到了这么⼀连串的字节数据, 就不知道从哪个部分开始到哪个部分, 是⼀个完整的应⽤层数据包.
那么如何避免粘包问题呢? 归根结底就是⼀句话, 明确两个包之间的边界.
对于定长的包 保证每次都按固定⼤⼩读取即可; 例如上⾯的Request结构, 是固定⼤⼩的, 那么就从缓冲区从头开始按sizeof(Request)依次读取即可;
对于不定长的包 方案一对于变⻓的包, 可以在包头的位置, 约定⼀个包总⻓度的字段, 从⽽就知道了包的结束位置; 方案二 对于变⻓的包, 还可以在包和包之间使⽤明确的分隔符(应⽤层协议, 是程序猿⾃⼰来定的, 只要保证分隔符不和正⽂冲突即可);
对于UDP协议来说, 是否也存在 “粘包问题” 呢?
对于UDP, 如果还没有上层交付数据, UDP的报⽂⻓度仍然在. 同时, UDP是⼀个⼀个把数据交付给应 ⽤层. 就有很明确的数据边界.站在应⽤层的站在应⽤层的⻆度, 使⽤UDP的时候, 要么收到完整的UDP报⽂, 要么不收. 不会出 现半个的情况. 2.11 异常情况
1. 进程终⽌: 进程终⽌会释放⽂件描述符, 仍然可以发送FIN. 和正常关闭没有什么区别.
2. 机器重启: 和进程终⽌的情况相同.
3. 机器掉电/⽹线断开: 接收端认为连接还在, ⼀旦接收端有写⼊操作, 接收端发现连接已经不在了, 就会进⾏reset. 即使没有写⼊操作, TCP⾃⼰也内置了⼀个保活定时器心跳包 也可以称为探测包, 会定期询问对⽅是否还在. 如果对⽅不在, 也会把连接释放.
另外, 应⽤层的某些协议, 也有⼀些这样的检测机制. 例如HTTP⻓连接中, 也会定期检测对⽅的状态. 例 如QQ, 在QQ断线之后, 也会定期尝试重新连接. 3. TCP 协议⼩结
为什么TCP这么复杂? 因为要保证可靠性, 同时⼜尽可能的提⾼性能.
可靠性:
校验和序列号(按序到达)确认应答超时重发连接管理流量控制拥塞控制
提⾼性能:
滑动窗⼝快速重传延迟应答捎带应答
基于TCP应⽤层协议
HTTP 超文本传输协议 HTTPS 是 HTTP 的安全版本。它通过 SSL/TLS 协议对 HTTP 进行加密以确保数据在客户端如浏览器和服务器之间的传输是安全的。 SSH 安全外壳协议。它是一种加密网络协议用于在不安全的网络中为网络服务提供安全的通信通道。 Telnet 主要用于通过网络提供终端仿真服务。全称:电信网络。Telnet 协议允许用户通过网络登录到远程计算机并像使用本地计算机一样操作远程系统。它工作在OSI模型的第7层应用层基于TCP/IP协议族。 FTP 是一种用于在网络上进行文件传输的标准协议。它允许用户将文件从一台主机传输到另一台主机无论这两台主机使用的是什么操作系统。FTP 通常工作在TCP/IP协议栈的第7层应用层 SMTP 用于发送电子邮件的标准协议。它定义了邮件如何在发送者和接收者之间进行传输以及如何路由这些邮件通过不同的邮件服务器直到它们到达最终目的地。 TCP/UDP对⽐ TCP⽤于可靠传输的情况, 应⽤于⽂件传输, 重要状态更新等场景; UDP⽤于对⾼速传输和实时性要求较⾼的通信领域, 例如, 早期的QQ, 视频传输等. 另外UDP可以⽤ 于⼴播;
归根结底, TCP和UDP都是程序员的⼯具, 什么时机⽤, 具体怎么⽤, 还是要根据具体的需求场景去判定.
今天就到这里了感谢观看