4.计算机网络_TCP

可靠与效率

TCP的主要特点:

  • TCP是面向连接的运输层协议,每一条TCP连接只能有两个端点,即:点对点、一对一形式。每一个端口都是一个socket
  • TCP提供可靠交付的服务
  • TCP提供全双工通信,因为TCP的收发缓冲区是分开的。
  • TCP面向字节流。流指的是流入或流出进程的字节序列。面向字节流指的是尽管应用程序与TCP的交互是一次一个数据块,但TCP仅仅认为接收到的数据是无结构的字节序列。
  • TCP不关心应用程序一次把多长的报文发送到TCP缓存,只根据对方给出的窗口值与当前网络的拥塞程度来决定一个报文段应包含多少个字节,形成TCP报文段

1、可靠传输及错误处理 

可靠传输过程:

发送方A每发送完成一个分组就会停止发送,等待接收方B返回确认信号。发送方A接收到确认信号后再开启下一次的分组发送。

发送方如何处理通信错误的问题:

使用超时重传的方式解决。发送方A发送之后,通过接收方B返回的确认信号是否正常接收。在A中会为每一个们组设置一个超时计时器,只有在计时器范围内接收到了B的信号,才会进行下一个分组的发送,如果没有收到B的确认信号,则重传该分组。

4种通信错误:

  • 分组错误:B收到A发送的分组后,经过检验发现该分组不能使用,此时B不会发送确认信号   

                         分组错误其实就是发来的数据有问题。

  • 分组丢失:B根本就没有收到A发送的分组,此时B肯定不会发送确认信号。

                         分组丢失其实就是发送的数据丢了。

  • 确认丢失:B发送了确认,但A没收到。此时A会重发数据

                         情况1:A重发,B收到的数据错误,不会发送确认。这种情况直到B收到正确为止

                         情况2:A重发,B收到了正确数据,B丢弃重复的数据,并发送确认。该错误结束

  • 确认迟到:B发送了确认,但A收到的时候已经超时了。此时A会重发数据

                         情况1:A重发,B收到的数据错误,不会发送确认。这种情况直到B收到正确为止

                         情况2:A重发,B收到了正确数据,B丢弃重复的数据,并发送确认。

                                      A接收到确认丢弃重复的确认信号

2、提高效率的方式 

提高传输效率的方式:

采用流水线传输,即:在发送分组和等待确认这个时间段中,发送方不断发出多个分组。

连续ARQ协议与滑动窗口协议采用该种方式来提高传输效率。这两个协议是TCP的子协议。

流水线传输的实现: 

  • 发送窗口

发送窗口是规定一个范围,这个范围就叫做窗口。在这个窗口内的分组可以被连续发送出去,而不需要等待对方确认。如下图,就是一个大小为5的窗口,这12345个分组将会被连续发出。

  • 发送窗口滑动

发送窗口滑动,就是动态的移动窗口。当接收方收到一个确认,代表有一个分组被传输完成,此时便可以将窗口向前移动一个分组。如下图,就是当接收方接收到分组1返回的确认信号后,就可以将这个窗口向前移动到红框位置。

  • 累计确认

因为流水线传输这种方法是将分组连续发出,那么接收方也是连续接收到数据。当在一个处理周期内,接收到了多个正确的数据,那么接收方只需要发送最后一个数据的确认来代表全部分组的确认,而不是每个分组都发一个确认。

如下图,当接收方连续接收到M2、M3、M4、M5时,并不是发送4个确认信号,而是发送一个M5的确认信号代表这四个数据都收到了。M5这个确认信号就是累计确认。

3、包头设计

TCP报文段整体框图:

在下图中可以看到,TCP报文段包含TCP首部(包头)和TCP数据这两部分。

TCP首部包含上方蓝色区域的部分,其中有20个字节是固定的,在这20个字节后可以去主动添加"选项"这个内容,"填充"部分是为了使得"选项"内容进行字节对齐。

TCP数据包含下方绿色和橙色区域,由IP首部和IP数据这两部分构成。

TCP包头大小如何计算: 

TCP首部的大小至少20个字节,这20个字节是固定的首部。之后有更多数据("选项-填充"部分)可以继续向下加,新的数据大小应该是4n个字节,如果不够4n个字节将补齐。即:TCP首部的大小应该是4的正数倍

数据偏移是指定TCP报文段中数据开始的位置,这其实也是指TCP包头的大小。数据偏移占4个bit,因此范围是0~15,包头大小与数据偏移的关系为:大小 = 数据偏移 * 4 。例如数据偏移=5,那么包头大小就是5*4=20个字节。

序号与确认号如何计算:

  • 序号:当前发送的分组序号,这是第一个字节的编号(有且仅有第一个分组是随机的)。
  • 确认号:发送分组之后接收端返回的确认信号,确认信号 = 序号 + 收到的数据个数

假设这个分组序号是100,这也代表第一个字节的编号是100,那么第二个字节编号就是101,依次类推。假如这个数据有200个字节,那么接收方最终收到的字节的序号就是100+200-1=299,最终返回的确认号就是299+1=300。同时这个300代表了下一个分组序号为300。

TCP包头其他内容解释:

  • 源端口:存放了发送端的端口信息。16位,与博文"端口号"章节中叙述的规则一致。
  • 目的端口:存放了接收端的端口信息。16位
  • URG:1代表使能紧急指针,0代表无效
  • 紧急指针:紧急数据存放在TCP数据的靠前的一段,紧急指针就是指定哪一部分是紧急数据。
  • ACK:1代表确认号有效,0代表无效
  • PSH:1代表数据已传输完成,可以交给应用进程,0代表无效
  • RST:1代表通信中出现严重问题,TCP数据中断,0代表无效
  • SYN:1代表发起连接请求(三次握手),0代表无效
  • FIN:1代表断开连接请求(四次挥手),0代表无效
  • 窗口:流水线传输法中的窗口,数值代表窗口的大小
  • 检验和:检验TCP的数据是否正确。

TCP的连接管理

1、三次握手

什么是三次握手:

握手就是TCP建立连接的过程,三次握手指的是TCP采用的连接方式是三报文握手,在客户端与服务器之间交换三个TCP报文段。目的是防止已失效的连接请求报文段突然又传输到了,因而产生TCP连接建立错误。 

注意:对于建立连接,只能由客户端发起。

三次握手避免连接错误的过程:

1、服务器启动,准备接收客户端的连接请求

2、客户端启动,向服务器发送连接请求报文段,这个报文段称为SYN报文段

      包头的SYN=1(请求连接),序号seq=x(随机值)

注意1:SYN报文段不允许携带数据,但会消耗一个序号。正常情况下是收到一个字节的数据,才消耗掉一个序号。

3、服务器收到客户端的SYN报文段后,如果同意连接则发回确认报文段,这也是一个SYN报文段

     包头的SYN=1,ACK=1(代表确认),确认号ack=x+1,序号seq=y(随机值)

注意1:seq=y的y指的是服务器端数据的序号,与第2点seq=x的x做一个区分。客户端与服务器发送的数据序号是独立的,互相没有关系的

注意2:确认信号ack = 序号 + 收到的数据个数,在这里,SYN报文段没有携带数据但是需要消耗一个序号,即:假设收到的数据个数为1。因此ack=x+1

注意3:ACK=1代表确认信号,不是说服务器收到了确认信号,而是将ACK=1发给客户端,客户端收到确认报文段中,能够解析出ACK=1,从而得知服务器发送了确认信号

4、客户端收到服务器的SYN报文段后,向服务器再发送一次确认信号。这个报文是ACK报文段

      包头的ACK=1,序号seq=x+1(第一次SYN报文段时是x),确认信号ack=y+1(同理 3-注意2)

注意:当客户端发送了SYN报文段,并收到服务器的确认报文段之后,就代表连接建立。

          当服务器发送了SYN报文段,并收到了客户端的确认报文段后,就代表连接建立。

注意:ACK报文段可以携带数据,如果不携带数据则不消耗序号

2、四次挥手

什么是四次挥手:

挥手就是TCP断开连接的过程,四次挥手指的是TCP采用的连接方式是四报文挥手。

注意:对于断开连接,客户端和服务器都可以发起。

什么是三次挥手:

三次挥手就是在服务器收到客户端的FIN报文段后,将确认信号与包含数据的报文段一并发给客户端的情况。这样原本确认信号、包含数据的报文段需要两步,现在就只需要了一步,这就使得四次挥手变成了三次挥手。

四次挥手避免连接错误的过程:

1、客户端向服务器发送释放报文段,这个报文段是FIN报文段。

      包头的FIN=1,序号seq=u(u就是正常的该传哪一个信号)

注意:FIN报文段不携带数据,但消耗一个序号。

注意:此时客户端终止 "客户端->服务器" 的通信

2、服务器收到FIN报文段后,返回确认信号。

       包头的ACK=1,确认号ack=u+1

注意:此时服务器得知了 "客户端->服务器" 的通信已经断开,但服务器处于半关闭状态。

3、服务器如果有数据,则继续向客户端发送数据报文段 ,这是FIN报文段

      包头的FIN=1,ACK=1,序号seq=w,确认号ack=u+1

4、 客户端收到服务器发送的确认信号和数据报文段后,向服务器发送确认信号。

       包头的ACK=1,序号seq=u+1,ack=w+1

注意:此时客户端得知了 "服务器->客户端" 的通信已经断开。

注意:此时客户端并不会立刻断开连接,而是等待2MSL后才真正断开连接。MSL就是最大报文生存周期,就是"可靠传输"章节的定时器。

5、服务器收到客户端的确认信号后,半连接状态断开。

注意:此时服务器真正断开连接

什么是半关闭状态:

半关闭状态就是指如果服务器并没有完全关闭,如果服务器在接收到FIN报文段,发送确认信号之后,依旧有信号要发送,那么将会再向客户端发送一个包含数据的报文段。

当数据大小不是很大时,通常将包含数据的报文段与确认信号报文段合并一起,一并发出。

客户端等待2MSL后才真正关闭的原因:

当客户端接收到服务器的FIN数据报后,向服务器发送确认信号,这个确认信号的生存周期就是MSL。

因为TCP的可靠传输性质,当服务器在MSL之后还未收到客户端发来的确认信号,那么服务器就认为通信出错(就是"可靠传输"-"4种通信错误"中的错误),就会重新发送一个FIN数据报。这个重新发送的数据报的生存周期是MSL。

这意味这如果客户端在发送确认信号后2MSL时间范围内收到了又一个FIN数据报,那么代表通信错误,客户端将再次向服务器发送确认信号,之后重复等待2MSL这个逻辑。

保活计时器:

保活计时器的目的是防止TCP连接中出现长时期的空闲,通常设置为2h。

当到达2h还没有通信时,服务器会自动向客户端发送一个探测报文段,去测试客户端是否还正常连接。如果发送了10个探测报文段后,客户端仍没有回应,服务器就认为客户端故障,主动终止连接。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/451536.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java导出带图形的word

先看效果图:方法都是一样的,所以数据只做了前两组 第一步需要准备模版: 新建一个word插入图表,选择想要的图表。 编辑图表:营业额表示数字,季度表示文字。其他的样式编辑可根据自己的需求更改,…

(42)MATLAB中使用fftshift绘制以零为中心的功率谱

文章目录 前言一、MATLAB代码二、仿真结果画图 前言 在分析信号的频率分量时,将零频分量平移到频谱中心会很有帮助。本例给出绘制以零为中心的功率谱的方法。 一、MATLAB代码 代码如下: f 1; % 余弦波的振荡频率&#xf…

400行程序写一个实时操作系统(十):用面向对象思想构建抢占式内核

前言 通过前几章的学习,我们学会了如何为RTOS设计一个合理的内存管理算法。现在,是时候学习设计RTOS内核了。 关于RTOS内核的文章也有很多,但都有一点先射箭再化靶子的意味。要么是代码连篇解释却寥寥无几,要么是要先怎么样再怎么…

大数据linux操作系统

第一关:Linux的初体验 答案: cd / ls -a / (里面有空格要注意) 第二关:Linux的常用命令 答案: touch newfile mkdir newdir cp newfile newdir/newfileCpy 第三关:Linux查询命令帮助语句…

飞机大战告尾

参考 PPO算法逐行代码详解 链接 通过网盘分享的文件:PlaneWar 链接: https://pan.baidu.com/s/1cbLKTcBxL6Aem3WkyDtPzg?pwd1234 提取码: 1234 10.17关于博客发了又改这件事 悲催的事 今天训练了一早上ppo模型,满怀期待的检测成果时发现一点长进都…

根据语音生成视频33搜帧

33搜帧,是一个能根据语音生成视频的网站,33搜帧 - 视频帧画面搜索引擎 33搜帧是一个使用AI技术构建的视频帧画面搜索引擎,和一般素材平台通过视频标签来搜索视频不同,33搜帧能搜索到视频素材中的每一帧画面,这个功能可…

基于SpringBoot+Vue+uniapp的海产品加工销售一体化管理系统的详细设计和实现(源码+lw+部署文档+讲解等)

详细视频演示 请联系我获取更详细的视频演示 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更专注于业务逻辑而不…

软考(网工)——网络操作系统与应用服务器

文章目录 网络操作系统与应用服务器🕐本地用户与组1️⃣Windows server 2008R2 本地用户与组2️⃣常见用户组与权限 🕑活动目录1️⃣活动目录2️⃣活动目录(Active Directory,AD)3️⃣活动目录工作组分类 🕒远程桌面与…

uniapp学习(005-1 详解Part.1)

零基础入门uniapp Vue3组合式API版本到咸虾米壁纸项目实战,开发打包微信小程序、抖音小程序、H5、安卓APP客户端等 总时长 23:40:00 共116P 此文章包含第36p-第p40的内容 文章目录 响应式尺寸单位 rpx各种工具修改ui给的图片的宽度ps操作步骤即时设计操作步骤&…

高级算法设计与分析 学习笔记13 线性规划

注意是线性规划不是动态规划哦 好家伙,这不是凸优化吗? 凸优化标准形式: 先改成统一最大化(凸优化那边怎么是统一最小化?) 原来的x2正负无所谓,但我希望每个x都是有限制的,所以把它改…

高德开放平台API调用实战指南

本文 一、地图展示1.1 地图初始化与展示1.2 自定义标记 二、路线规划2.1 驾车路线规划2.2 步行路线规划 三、定位服务3.1 使用JavaScript API进行定位3.2 IP定位 四、实时交通信息查询4.1 获取实时交通路况 五、智能调度引擎总结 一、地图展示 地图展示是开发基于地理信息系统…

【MySQL】设置二进制日志文件自动过期,从根源上解决占满磁盘的问题:通过修改 binlog_expire_logs_seconds 配置项

引言 MySQL的二进制日志(binlog)文件记录了数据库中所有更改的详细信息,包括但不限于对数据的插入、删除、更新,对表和数据库的创建、更改、删除等操作。每一次这样的操作都会在二进制日志中生成一个新的日志事件,并被…

【Linux】命令行下的增删查改之“查看”

致谢:Linux常用命令大全(手册) – 真正好用的Linux命令在线查询网站 提供的命令查询 头部内容获取(head) head命令的功能是显示文件开头的内容,默认值为前10行。 指令参数: -n 定义显示行数 -c 指定显示头部内容的字符数 -v 总是显示文件名的头信…

实现双向链表的增删改查

头文件 #pragma once #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <stdbool.h> typedef int LTDataType; typedef struct ListNode {LTDataType data;struct ListNode* prev;struct ListNode* next; } LTNode; //v…

matlab输入汉字时,输入法在左上角显示解决办法

解决方法&#xff1a; 输入汉字时输入法在左上角显示&#xff08;如图1&#xff09;&#xff0c;将鼠标放在竖着的小点处拖动到工作区合适位置&#xff08;如图2&#xff09;&#xff0c;下次输入汉字时输入法便在图2处显示。 图1 图2

如何测试IP速度?

了解代理的连接速度是否快速是确保网络使用效率和体验的关键因素之一。本文来为大家如何有效地评估和测试代理IP的连接速度&#xff0c;以及一些实用的方法和工具&#xff0c;帮助用户做出明智的选择和决策。 一、如何评估代理IP的连接速度 1. 使用在线速度测试工具 为了快速…

OpenCV高级图形用户界面(6)获取指定窗口中图像的矩形区域函数getWindowImageRect()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 提供窗口中图像的矩形区域。 该函数 getWindowImageRect 返回图像渲染区域的客户端屏幕坐标、宽度和高度。 函数原型 Rect cv::getWindowImage…

Vue详细入门(语法【一】)

今天滴学习目标&#xff01;&#xff01;&#xff01; Vue1. 什么是Vue.js2. Vue是怎么使用的嘞3. MVVM是什么嘞&#xff1f;4. Vue有哪些指令1. v-bind2.v-model3.v-if 和 v-else4. v-for5. v-show6. v-on 咱们先了解一下什么是Vue&#xff0c;Vue是怎么使用的嘞&#xff0c;V…

甘特图基线-用起来了吗~

管理项目无疑是一项充满挑战的任务&#xff01;每个项目都伴随着严格的截止日期&#xff0c;因此&#xff0c;确保项目按时完成&#xff0c;并在推进过程中一一达成所有关键的里程碑&#xff0c;显得尤为重要。 为了更精准地掌握项目进展&#xff0c;利用甘特图的基线功能来捕捉…

【华为HCIP实战课程十三】OSPF网络中3类LSA及区域间负载均衡,网络工程师

一、ABR SW1查看OSPF ABR为R4而非R3,因为R4连接骨干区域0,R3没有连接到区域0 R6查看OSPF路由: 二、查看3类LSA,由于R6不是ABR因此自身不会产生3类LSA 但是有区域间路由就可以看到3类LSA