Android开发知识学习——TCP / IP 协议族

文章目录

  • 学习资源来自:扔物线
  • TCP / IP 协议族
  • TCP连接
    • TCP 连接的建立与关闭
      • TCP 连接的建立
        • 为什么要三次握手?
      • TCP 连接的关闭
        • 为什么要四次挥手?
      • 为什么要⻓连接?
  • 常见面试题
  • 课后题

学习资源来自:扔物线

TCP / IP 协议族

  • 一系列协议所组成的一个网络分层模型
  • 为什么要分层?
    因为网络的不稳定性
    在这里插入图片描述
  • Application Layer 应用层:HTTP、FTP、DNS,提供了网络应用程序之间的通信机制
  • Transport Layer 传输层:TCP、UDP,提供可靠的端到端的数据传输服务的层次
  • Internet Layer 网络层:IP,网络中所有数据传输的入口和出口
  • Link Layer 数据链路层:以太网、Wi-Fi,处理与传输媒介(如双绞线、光纤、无线电波等)的物理接口细节
    在这里插入图片描述

TCP连接

什么叫做连接
通信双方建立确认「可以通信」,不会将对方的消息丢弃,即为「建立连接」

TCP 连接的建立与关闭

TCP 连接的建立

在这里插入图片描述

① 首先客户端向服务器发送一个 SYN 包,并等待服务器确认,其中:

  • 标志位为 SYN,表示请求建立连接;
  • 序号为 Seq = x(x 一般取随机数);
  • 随后客户端进入 SYN-SENT 阶段。

② 服务器接收到客户端发来的 SYN 包后,对该包进行确认后结束 LISTEN 阶段,并返回一段 TCP 报文,其中:

  • 标志位为 SYN 和 ACK,表示确认客户端的报文 Seq 序号有效,服务器能正常接收客户端发送的数据,并同意创建新连接;
  • 序号为 Seq = y;
  • 确认号为 Ack = x+ 1,表示收到客户端的序号 Seq 并将其值加 1 作为自己确认号 Ack 的值,随后服务器端进入 SYN-RECV 阶段。

③ 客户端接收到发送的 SYN + ACK 包后,明确了从客户端到服务器的数据传输是正常的,从而结束 SYN-SENT 阶段。并返回最后一段报文。其中:

  • 标志位为 ACK,表示确认收到服务器端同意连接的信号;
  • 序号为 Seq = x + 1,表示收到服务器端的确认号 Ack,并将其值作为自己的序号值;
  • 确认号为 Ack= y + 1,表示收到服务器端序号 seq,并将其值加 1 作为自己的确认号 Ack 的值。
  • 随后客户端进入 ESTABLISHED。
    当服务器端收到来自客户端确认收到服务器数据的报文后,得知从服务器到客户端的数据传输是正常的,从而结束 SYN-RECV 阶段,进入 ESTABLISHED 阶段,从而完成三次握手
为什么要三次握手?

检查当前这个网络的情况是否满足可靠传输的基本条件
为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。

具体例子:“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。

TCP 连接的关闭

当客户端和服务器通过三次握手建立了TCP连接以后,当数据传送完毕,肯定是要断开TCP连接的啊。那对于TCP的断开连接,这里就有了神秘的“四次挥手”。

在这里插入图片描述

比如客户端初始化的序列号ISA=100,服务端初始化的序列号ISA=300。TCP连接成功后客户端总共发送了1000个字节的数据,服务端在客户端发FIN报文前总共回复了2000个字节的数据。

  • 第一次挥手:当客户端的数据都传输完成后,客户端向服务端发出连接释放报文(当然数据没发完时也可以发送连接释放报文并停止发送数据),释放连接报文包含FIN标志位(FIN=1)、序列号seq=1101(100+1+1000,其中的1是建立连接时占的一个序列号)。需要注意的是客户端发出FIN报文段后只是不能发数据了,但是还可以正常收数据;另外FIN报文段即使不携带数据也要占据一个序列号。

  • 第二次挥手:服务端收到客户端发的FIN报文后给客户端回复确认报文,确认报文包含ACK标志位(ACK=1)、确认号ack=1102(客户端FIN报文序列号1101+1)、序列号seq=2300(300+2000)。此时服务端处于关闭等待状态,而不是立马给客户端发FIN报文,这个状态还要持续一段时间,因为服务端可能还有数据没发完。

  • 第三次挥手:服务端将最后数据(比如50个字节)发送完毕后就向客户端发出连接释放报文,报文包含FIN和ACK标志位(FIN=1,ACK=1)、确认号和第二次挥手一样ack=1102、序列号seq=2350(2300+50)。

  • 第四次挥手:客户端收到服务端发的FIN报文后,向服务端发出确认报文,确认报文包含ACK标志位(ACK=1)、确认号ack=2351、序列号seq=1102。注意客户端发出确认报文后不是立马释放TCP连接,而是要经过2MSL(最长报文段寿命的2倍时长)后才释放TCP连接。而服务端一旦收到客户端发出的确认报文就会立马释放TCP连接,所以服务端结束TCP连接的时间要比客户端早一些。

为什么要四次挥手?

TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。

为什么要⻓连接?

因为移动网络并不在 Internet 中,而是在运营商的内网,并不具有真正的公网 IP,
因此当某个 TCP 连接在一段时间不通信之后,网关会出于网络性能考虑而关闭这条
TCP 连接和公网的连接通道,导致这个 TCP 端口不再能收到外部通信消息,即 TCP
连接被动关闭

⻓连接的实现方式
心跳。即在一定间隔时间内,使用 TCP 连接发送超短无意义消息来让网关不能将自
己定义为「空闲连接」,从而防止网关将自己的连接关闭。

常见面试题

  • 为什么TCP连接的时候是3次?2次不可以吗?
    因为需要考虑连接时丢包的问题,如果只握手2次,第二次握手时如果服务端发给客户端的确认报文段丢失,此时服务端已经准备好了收发数(可以理解服务端已经连接成功)据,而客户端一直没收到服务端的确认报文,所以客户端就不知道服务端是否已经准备好了(可以理解为客户端未连接成功),这种情况下客户端不会给服务端发数据,也会忽略服务端发过来的数据。如果是三次握手,即便发生丢包也不会有问题,比如如果第三次握手客户端发的确认ack报文丢失,服务端在一段时间内没有收到确认ack报文的话就会重新进行第二次握手,也就是服务端会重发SYN报文段,客户端收到重发的报文段后会再次给服务端发送确认ack报文。

  • 为什么TCP连接的时候是3次,关闭的时候却是4次?
    因为只有在客户端和服务端都没有数据要发送的时候才能断开TCP。而客户端发出FIN报文时只能保证客户端没有数据发了,服务端还有没有数据发客户端是不知道的。而服务端收到客户端的FIN报文后只能先回复客户端一个确认报文来告诉客户端我服务端已经收到你的FIN报文了,但我服务端还有一些数据没发完,等这些数据发完了服务端才能给客户端发FIN报文(所以不能一次性将确认报文和FIN报文发给客户端,就是这里多出来了一次)。

  • 为什么客户端发出第四次挥手的确认报文后要等2MSL的时间才能释放TCP连接?
    这里同样是要考虑丢包的问题,如果第四次挥手的报文丢失,服务端没收到确认ack报文就会重发第三次挥手的报文,这样报文一去一回最长时间就是2MSL,所以需要等这么长时间来确认服务端确实已经收到了

课后题

1.【单选题】TCP / IP 协议族中,HTTP 协议在哪一层?
A. 应用层
B. 传输层
C. 网络互联层
D. 数据链路层

答案: A
答案解析:HTTP(Hypertext Transfer Protocol)协议是一种应用层协议,它用于在网络中传输超文本(例如网页)。在TCP/IP协议族中,HTTP协议位于最上层,也就是应用层。

2.【单选题】TCP / IP 协议族中,TCP 协议在哪一层?
A. 应用层
B. 传输层
C. 网络互联层
D. 数据链路层

答案: B
答案解析:TCP(Transmission Control Protocol)协议是一种传输层协议,它在TCP/IP协议族中位于传输层。TCP协议负责将数据分段并提供可靠的传输,确保数据能够在网络中正确地传输到目标地址

3.【单选题】TCP / IP 协议族中,IP 协议在哪一层?
A. 应用层
B. 传输层
C. 网络互联层
D. 数据链路层

答案: C
答案解析:IP协议(Internet Protocol)是TCP/IP协议族中的核心协议之一,它位于网络互联层。IP协议负责将数据包从一个网络发送到另一个网络,确保数据的路由和传输

4.【单选题】TCP 协议的主要作用是?
A. 进行具体的网络应用交互
B. 保证网络数据的可靠传输
C. 解决在网络上传输包的问题,例如网络寻址、以包为单位发送网络数据

答案: B
答案解析:TCP(Transmission Control Protocol,传输控制协议)的主要作用是保证网络数据的可靠传输。TCP协议是一种面向连接的协议,它提供了一种可靠的、有序的和错误校验的数据传输方式。在TCP协议中,发送方和接收方之间建立连接,然后通过确认、序列号和流量控制等机制,确保数据的可靠传输。相比之下,应用层协议(如HTTP)主要负责具体的网络应用交互,而网络层协议(如IP)主要负责解决在网络上传输包的问题,例如网络寻址、以包为单位发送网络数据。因此,TCP协议的主要作用是保证网络数据的可靠传输

5.【单选题】IP 协议的主要作用是?
A. 进行具体的网络应用交互
B. 保证网络数据的可靠传输
C. 解决在网络上传输包的问题,例如网络寻址、以包为单位发送网络数据

答案: C
答案解析:IP协议是TCP/IP协议族中的核心协议之一,它负责将数据包从一个网络发送到另一个网络,确保数据的路由和传输。IP协议通过将数据分成一个个的数据包,并在每个数据包中包含源IP地址和目标IP地址,来实现数据的路由和传输。因此,IP协议的主要作用是解决在网络上传输包的问题,例如网络寻址、以包为单位发送网络数据

  1. 【作文题】 简述 TCP 连接建立时的「三次(三向)握手」

答案: TCP 连接建立时的 “三次握手” 是指在 TCP 协议中,建立连接时需要发送三个数据包来确认连接的建立。具体过程如下:

  1. SYN:首先,客户端发送一个带有 SYN(同步)标志的数据包到服务器。这个数据包中会包含一个随机生成的序列号,假设为 X。
  2. SYN-ACK:收到 SYN 包后,服务器会向客户端发送一个带有 SYN 和 ACK(确认)标志的数据包。这个数据包中包含两个序列号,一个是服务器自己随机生成的,假设为
    Y,另一个是对客户端的确认号,这个确认号等于客户端的序列号加一,即 Y = X + 1。
  3. ACK:最后,客户端再向服务器发送一个 ACK 数据包,其序列号等于服务器的序列号加一,即 Y = X + 2。 这样,就完成了 TCP 连接的三次握手过程,从而建立了可靠的连接。
  1. TCP为什么是三次握手不是两次握手?

答案: TCP协议使用三次握手是为了确保连接建立成功、确认收到数据包和对方的初始序列号以及防止已失效的连接请求报文突然又传送到了服务器1。

如果使用两次握手,在第一次握手时,客户端发送SYN数据包,服务器收到后没有发送确认报文,客户端超时后重新发送SYN数据包,此时如果网络中存在重传机制,客户端可能会接收到旧的SYN数据包,导致连接建立错误1。

  1. 【作文题】 简述 TCP 连接关闭时的「四次挥手」

答案: TCP 连接关闭时的 “四次挥手” 是指在 TCP 协议中,关闭连接时需要发送四个数据包来确认连接的关闭。具体过程如下:

  1. FIN:首先,客户端发送一个带有 FIN(结束)标志的数据包到服务器,用来关闭客户端到服务器的数据传送。
  2. ACK:服务器收到 FIN 后,发送一个带有 ACK(确认)标志的数据包到客户端,确认序号为收到序号加一,服务器进入 CLOSE_WAIT 状态。
  3. FIN:然后,服务器发送一个带有 FIN 标志的数据包到客户端,用来关闭服务器到客户端的数据传送,服务器进入 LAST_ACK 状态。
  4. ACK:最后,客户端收到 FIN 后,发送一个带有 ACK 标志的数据包到服务器,确认序号为收到序号加一,服务器进入 CLOSED 状态,完成四次挥手。
  1. 【作文题】 为什么 TCP 连接在断开时是四次挥手而不是三次?

答案: TCP 连接在断开时采用四次挥手而不是三次握手,主要是考虑到可靠性的问题
在三次握手的过程中,如果最后一个 ACK 数据包丢失,那么客户端会重新发送一个 FIN 数据包,而服务器会因为无法收到确认而进入 TIME_WAIT 状态。这种情况下,服务器会等待一段时间以确保所有的数据包都已发送完毕,然后才会关闭连接。然而,这段时间内服务器不能接受新的连接,造成了资源的浪费。
为了解决这个问题,TCP 协议采用了四次挥手的过程。在第四次挥手后,服务器可以立即释放连接,而不需要等待一段时间。这样,服务器可以更高效地利用资源,同时也减少了客户端和服务器之间的数据包数量。
因此,TCP 连接断开时采用四次挥手而不是三次握手是为了提高连接的可靠性并优化资源利用

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Simulink HDL--如何生成Verliog代码

Simulink生成HDL的方法可以快速设计出工程,并结合FPGA验证,相比于手写HDL代码虽然存在代码优化不足的问题。但是方法适合做工程的快速验证和基本框架搭建。本文将介绍Simulink HDL生成Verliog代码的基本操作 1、逻辑分析仪功能 Simulink生成HDL前需要通…

想翻译pdf文档,试了几个工具对比:有阿里(完全免费,快,好用,质量高,不用注册登录)道最好(有限免费) 百度(有限免费)和谷歌完全免费(网不好)

文档翻释作为基础设施,工作必备。 阿里 (完全免费,快,好用,质量高,不用注册登录,无广告)我给满分 https://translate.alibaba.com/#core-translation 先选好语言。 Google(完全免…

数据结构和算法——用C语言实现所有图状结构及相关算法

文章目录 前言图的基本概念图的存储方式邻接矩阵邻接表十字链表临界多重表 图的遍历最小生成树普里姆算法(Prim)克鲁斯卡尔算法(Kruskal) 最短路径BFS求最短路径迪杰斯特拉算法(Dijkstra)弗洛伊德算法&…

03-对象

对象 对象1.对象的创建字面量模式构造函数模式 2.对象的访问3.新增删除对象中的属性4.Object显示类型转换(强制类型转换)ECMAScript中可用的3种强制类型转换如下:Boolean(value)String(value)Number(value)Object类型到Boolean类型Object类型转String类型转换规则&a…

leetcode-字符串

1.反转字符串LeetCode344. 20230911 难度为0,此处就不放代码了 注意reverse和swap等一系列字符串函数什么时候该用,记一记库函数 swap可以有两种实现,涨知识了,除了temp存值还可以通过位运算:s[i] ^ s[j]; s[j] ^ s[i…

Unity Animator cpu性能测试

测试案例: 场景中共有4000个物体,挂在40个animtor 上,每个Animator控制100个物体的动画。 使用工具: Unity Profiler. Unity 版本: unity 2019.4.40f1 测试环境: 手机 测试过程: 没有挂…

Java 设计模式——命令模式

目录 1.概述2.结构3.案例实现3.1.命令接口3.2.具体命令3.3.接受者3.4.调用者3.5.测试 4.优缺点5.使用场景6.JDK 源码解析——Runnable 1.概述 (1)日常生活中,我们出去吃饭都会遇到下面的场景: (2)命令模…

医学AI智能导诊系统源码

医院智能导诊系统是一款基于人工智能和大数据技术开发的医疗辅助软件,旨在为患者提供更加便捷、精准的医疗服务。 一、什么是智能导诊系统? 智能导诊系统是一种基于人工智能和大数据技术开发的医疗辅助软件,它能够通过对患者的症状、病史等信…

干货分享,大厂内部压测方案设计!

01、为什么要做压测 1、什么是压力测试? 不断向被测对象施加压力,测试系统在压力情况下的表现。 2、压力测试的目的是什么? 测试得出系统的极限性能指标,从而给出合理的承诺值或者容量告警; 找出系统的性能瓶颈&a…

【数据结构】树形结构所有路径复原为链表

目录 1. 树形结构可视化 2. 树形结构转为链表 此目标是要还原树形结构的所有路径。树形结构是一种常见的数据结构,它表示元素之间层次关系。在树形结构中,每个节点可能拥有一个或多个子节点,形成了一个分层的结构。为了还原树形结构的路径&…

区块链-蚂蚁链(阿里系产品),至信链(腾讯系),长安链(国家队)

目录 区块链-蚂蚁链(阿里系产品),至信链(腾讯系),长安链(国家队) ①蚂蚁链(阿里系产品) ②至信链(腾讯系) ③长安链(国家队) Hyp…

【Spring Boot 源码学习】RedisAutoConfiguration 详解

Spring Boot 源码学习系列 RedisAutoConfiguration 详解 引言往期内容主要内容1. Spring Data Redis2. RedisAutoConfiguration2.1 加载自动配置组件2.2 过滤自动配置组件2.2.1 涉及注解2.2.2 redisTemplate 方法2.2.3 stringRedisTemplate 方法 总结 引言 上篇博文&#xff0…

第一章 02Java入门-常环境变量的意义

前言 上次我们学习了常见的CMD命令,这次我们做一个用它做一个练习打开QQ(CMD方式打开),最后引出环境变量的意义。 一、CMD打开qq 可以看到,如果直接在CMD里面打开QQ,是不可以的,因为QQ的路径不在默认路径C盘,而在D盘下面的develop文件夹下面的qq下面的qq.exe下(自己…

有色金属冶炼VR虚拟场景互动教学有何优势

真实模拟:VR虚拟现实技术可以提供一个真实的虚拟环境,模拟钢铁制造现场,包括设备、工艺流程、操作规程等,使学员获得直观、真实的体验。 安全可靠:钢铁制造技能培训可以在虚拟环境中进行,不会对人员或设备造…

爆肝将近 10 万字讲解 Node.Js 详细教程

1. Node.Js 环境概述 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,用于在服务器端运行 JavaScript。它使用了一个事件驱动、非阻塞式I/O的模型,使得其轻量且高效。Node.js 的包管理器 npm 是全球最大的开源库生态系统。Node.js 能够响应大…

Windows安装tensorflow-gpu=1.14.0CUDA=10.0cuDNN=7.4 (多版本CUDA共存)

文章目录 0. 前置说明1. 查看版本对应关系2. 安装 cuda3. 安装 cudnn4. 添加环境变量5. 安装 tensorflow 0. 前置说明 本机(Windows 11)已安装CUDA 11.7 使用命令查看显卡驱动: nvidia-smi这里显示的CUDA Version: 11.7说明支持安装11.7版本…

python hashlib模块及实例

hashlib 模块密码加密密码撞库密码加盐 一,hashlib模块 hashlib模块是用来为字符串进行加密的模块,通过该作用就可以为用户的密码进行加密。 通过模块中的hash算法可以为任意长度的字符串加密成长度相同的一串hash值。该hash算法得到的hash值有一下几个…

汽车配件商城小程序制作 | 汽车配件售卖,高门槛但高利润

通过汽车配件商城小程序给别人的供货,利润可高达60%,但甚少有人关注汽车配件销售的行业。具体情况是怎么样的呢,下面给大家简单分析。 据数据显示,国内有4亿多辆汽车,这些汽车坏了要修,也要偶尔进行保养&am…

python实现MC协议(SLMP 3E帧)的TCP服务端(篇一)

python实现MC协议(SLMP 3E帧)的TCP服务端是一件稍微麻烦点的事情。它不像modbusTCP那样,可以使用现成的pymodbus模块去实现。但是,我们可以根据协议帧进行组包,自己去实现帧的格式,而这一切可以基于socket模…

清华大模型GLM

2022年,清华大学发布了一款具有重要意义的 GLM 大模型,它不仅在中文语言处理方面取得了显著的进展,还在英文语言处理方面表现出了强大的能力。GLM大模型区别于OpenAI GPT在线大模型只能通过API方式获取在线支持的窘境,GLM大模型属于开源大模型,可以本地部署进行行业微调、…