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

这篇具有很好参考价值的文章主要介绍了Android开发知识学习——TCP / IP 协议族。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

学习资源来自:扔物线

TCP / IP 协议族

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

TCP连接

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

TCP 连接的建立与关闭

TCP 连接的建立

Android开发知识学习——TCP / IP 协议族,android,学习,tcp/ip

① 首先客户端向服务器发送一个 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的断开连接,这里就有了神秘的“四次挥手”。

Android开发知识学习——TCP / IP 协议族,android,学习,tcp/ip

比如客户端初始化的序列号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 连接断开时采用四次挥手而不是三次握手是为了提高连接的可靠性并优化资源利用文章来源地址https://www.toymoban.com/news/detail-727186.html

到了这里,关于Android开发知识学习——TCP / IP 协议族的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (学习笔记)TCP基础知识

    TCP 是 面向连接的、可靠的、基于字节流 的传输层通信协议。 面向连接:一定是[一对一]才能连接,不能像UDP协议可以一个主机同时向多个主机发送消息,也就是一对多是无法做到的; 可靠的:无论网络链路中出现了怎样的链路变化,TCP都可以保证一个报文一定能够到达接收

    2024年02月16日
    浏览(59)
  • (学习笔记-TCP基础知识)TCP与UDP区别

    UDP不提供复杂的控制机制,利用IP提供面向[无连接]的通信服务。 UDP协议非常简单,头部只有8个字节(位),UDP的头部格式如下: 目标和源端口:主要是告诉UDP协议应该把报文发给哪个进程 包长度:该字段保存了UDP首部的长度跟数据的长度之和 校验和:提供可靠的UDP首部和数

    2024年02月17日
    浏览(43)
  • (学习笔记-IP)IP基础知识

    IP在TCP/IP参考模型中处于第三层,也就是 网络层。 网络层的主要作用是: 实现主机与主机之间的通信,也叫点对点的通信。  网络层与数据链路层的关系: MAC的作用是实现 直连 的两个设备之间通信,而IP负责 没有直连 的两个网络之间进行通信传输  因此 计算机网络中需要

    2024年02月16日
    浏览(52)
  • 网络基础学习:ip地址的知识

    IP地址是指用于标识在网络上的设备或节点的一组数字,它是Internet协议(IP)中使用的一种地址格式。 IP地址通常由32位二进制数表示,被分成4个8位的十进制数,每个十进制数之间用点分隔符分开。IP地址用于在因特网上寻找其他设备并进行数据通信,类似于邮政地址用于寻

    2024年02月04日
    浏览(51)
  • FAST迅捷路由的IP基础知识学习

    因此我们认为路由的过程就是将不同的IP地址网段的IP包进行转发。就相当于我们一个地方出发去另一个地方一样,会有很多路,那么你就需要从中选择一条你认为比较合适的路。那么实现这一功能的设备我们就称之为路由器。所以我们称路由器是数据包的运输工具。     一

    2024年02月05日
    浏览(44)
  • HTTP基础:学习HTTP协议的基本知识,了解请求和响应的过程

    HTTP(Hypertext Transfer Protocol,超文本传输协议)是一种用于传输超媒体文档(如HTML)的应用层协议,它是Web中最基本的协议。 HTTP请求和响应都是由客户端和服务器之间进行的。 一个完整的HTTP请求由以下几个部分组成: 请求行:包括请求方法(GET、POST等)、请求的URI和HTTP协

    2024年02月12日
    浏览(46)
  • 【FPGA零基础学习之旅#6】ip核基础知识之计数器

    🎉欢迎来到FPGA专栏~ip核基础知识之计数器 ☆* o(≧▽≦)o *☆ 嗨 ~我是 小夏与酒 🍹 ✨ 博客主页: 小夏与酒的博客 🎈该系列 文章专栏: FPGA学习之旅 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏 📜 欢迎大家关注! ❤️ LPM_COUNTER IP核 的RTL视图: IP核

    2024年02月09日
    浏览(46)
  • 【一文详解】知识分享:(C#开发学习快速入门)

    c语言 是面向过程。 c++ 是面向过程+面向对象。 c# 是纯粹的面向对象: 核心思想是以人的思维习惯来分析和解决问题。万物皆对象 。 面向对象开发步骤: 分析对象 特征 行为 关系(对象关系/类关系) 写代码: 特征–成员变量 方法–成员方法 实例化–具体对象 Note(补充知识)

    2024年01月19日
    浏览(67)
  • 【收藏】IP知识百科-TCP/IP协议栈&数通基础

    数据链路层相关 什么是ARP 什么是MTU 什么是CRC TCP/IP协议栈 什么是ICMP 什么是DHCP 什么是NAT IPv6 访问控制/防火墙 什么是ACL 什么是NGFW VLAN 什么是VLAN OVERLAY 什么是Overlay 什么是VxLAN1 什么是VxLAN2 VXLAN中的RT、RD是什么 控制平面 什么是MPLS 什么是EVPN1 什么是EVPN2 路由协议 什么是OSPF

    2024年02月07日
    浏览(52)
  • 一般开发Unity 使用什么语言,需要学习什么知识

    一般来说,开发Unity使用的是C#语言。要学习Unity开发,你需要学习的知识包括: C#语言的基础知识 Unity的基本使用方法 常用的游戏编程模式,如游戏循环、场景切换、碰撞检测等 了解游戏对象、资源、动画、物理等概念 了解常用的游戏开发插件和工具,如脚本编辑器、版本

    2024年02月13日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包