【JavaEE初阶】 TCP协议详细解析

这篇具有很好参考价值的文章主要介绍了【JavaEE初阶】 TCP协议详细解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🌲TCP协议的概念

TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。

🚩TCP协议段格式

java 解析tcp协议,JavaEE初阶,tcp/ip,java-ee,网络,java,网络协议

  • 源/目的端口号:表示数据是从哪个进程来,到哪个进程去;

  • 32位序号/32位确认号:后面详细讲;

  • 4位TCP报头长度:表示该TCP头部有多少个32位bit(有多少个4字节);所以TCP头部最大长度是15 * 4 = 60

  • 6位标志位:
    URG:紧急指针是否有效
    ACK:确认号是否有效
    PSH:提示接收端应用程序立刻从TCP缓冲区把数据读走
    RST:对方要求重新建立连接;我们把携带RST标识的称为复位报文段
    SYN:请求建立连接;我们把携带SYN标识的称为同步报文段
    FIN:通知对方,本端要关闭了,我们称携带FIN标识的为结束报文段

  • 16位窗口大小:后面再说

  • 16位校验和:发送端填充,CRC校验。接收端校验不通过,则认为数据有问题。此处的检验和不
    光包含TCP首部,也包含TCP数据部分

  • 16位紧急指针:标识哪部分数据是紧急数据;

  • 40字节头部选项:这里博主不做讲解

🚩TCP的特性

  • TCP提供一种面向连接的, 可靠的字节流服务;

  • 在一个TCP连接中,仅有两方进行彼此通信。广播和多播不能用于TCP;

  • TCP使用校验和, 确认和重传机制来保证可靠传输;

  • TCP使用累积确认

  • TCP使用滑动窗口机制来实现流量控制,通过动态改变窗口的大小进行拥塞控制

上述特性,在下面的TCP原理里面回进行一一介绍

🌳TCP原理

TCP对数据传输提供的管控机制,主要体现在两个方面:安全效率

这些机制和多线程的设计原则类似:保证数据传输安全的前提下,尽可能的提高传输效率

🚩确认应答机制(安全机制)

确认应答机制图示如下
java 解析tcp协议,JavaEE初阶,tcp/ip,java-ee,网络,java,网络协议
单看这一幅图还是比较懵逼的,接下来我为大家解答一下

我们知道TCP是属于可靠传输,它就为了解决UDP不可靠传输而发明的。我们有了确认应答机制后,我们每发送一个消息,都能收到对方的一个回应,确保自己知道自己的消息发过去了。

就像一个小伙子给他女神发消息说“我请你吃饭好吗?”,然后收到了女神的回复“好啊好啊”,小伙的请求收到了确认java 解析tcp协议,JavaEE初阶,tcp/ip,java-ee,网络,java,网络协议

在这个传输过程中了,我们用上述提到的ACK来表示请求和应答报文

  • ACK=0,表示是发送报文

  • ACK=1,表示是应答报文

但是光有确认应答还是不够,比如出现以下情况

小伙子对女神说“我请你吃饭好吗?”,然后这时候女生还没有回复,然后小伙又发了一句“做我女朋友好吗?”,这时候女神回消息了,回了两句为“滚”,“好啊好啊”
java 解析tcp协议,JavaEE初阶,tcp/ip,java-ee,网络,java,网络协议
那么这时候的小伙就懵了,小伙就想

  • 女神是现在不想吃饭,给我发了一句滚,她还是愿意做为我的女朋友的
  • 女神不想做我女朋友,但是想和一起吃饭

这时候的小伙也就迷茫了,女神到底什么意思呢?

这时候我们为了解决这一类问题,我们引入一个序号确认序号,发送数据是带上序号,确认应答时也带上一个确认序号一一对应
java 解析tcp协议,JavaEE初阶,tcp/ip,java-ee,网络,java,网络协议
做法不同的是

TCP将每个字节的数据都进行了编号。即为序列号
java 解析tcp协议,JavaEE初阶,tcp/ip,java-ee,网络,java,网络协议
每一个ACK都带有对应的确认序列号,意思是告诉发送者,我已经收到了哪些数据;下一次你从哪里开始发。

这样就保证了确认应答不会出错

🚩超时重传机制(安全机制)

有了确认应答后,我们的可靠性已经得到大大的提升,但是UDP中出现的丢包问题还是没有得到解决

意思也就是主机A向主机B发送数据,一定时间后,并没有收到应答,这里主机A没有收到应答报文有两种情况

  1. 主机A发送数据给B之后,可能因为网络拥堵等原因,数据无法到达主机B
  2. 主机B收到主机A的数据之后,做出应答后,应答报文没有到达主机A

这两种情况都当成第一种情况处理,客户端会进行重传数据
java 解析tcp协议,JavaEE初阶,tcp/ip,java-ee,网络,java,网络协议
java 解析tcp协议,JavaEE初阶,tcp/ip,java-ee,网络,java,网络协议

这时候有的人可能会想,如果是第一种情况,重传数据就好,但是如果出现第二种情况,那么这些数据不是相同了吗,不就出现数据重复了吗?

这时候我们可以利用前面提到的序列号,其实我们这里的主机B这里接收就像一个优先级的队列,我们会对传来的数据按照序列号进行排序,如果序列号相同,该队列还可以起到一个去重的效果

那么我们又会想超时的时间如何确定

  • 最理想的情况下,找到一个最小的时间,保证 “确认应答一定能在这个时间内返回”。

  • 但是这个时间的长短,随着网络环境的不同,是有差异的。

  • 如果超时时间设的太长,会影响整体的重传效率;

  • 如果超时时间设的太短,有可能会频繁发送重复的包;

TCP为了保证无论在任何环境下都能比较高性能的通信,因此会动态计算这个最大超时时间

  • Linux中(BSD Unix和Windows也是如此),超时以500ms为一个单位进行控制,每次判定超时重发的超时时间都是500ms的整数倍。
  • 如果重发一次之后,仍然得不到应答,等待 2*500ms 后再进行重传。
  • 如果仍然得不到应答,等待 4*500ms 进行重传。依次类推,以指数形式递增。
  • 累计到一定的重传次数,TCP认为网络或者对端主机出现异常,强制关闭连接。

🚩三次握手四次挥手(安全机制)

由于这里内容较多,我单独写了一篇进行介绍,大家可以博主写的《【JavaEE初阶】 TCP三次握手四次挥手(超详细版)》进行学习观看。

🚩滑动窗口(效率机制)

关于该部分的内容博主在《【JavaEE初阶】 TCP滑动窗口与流量控制和拥塞控制》有详细讲解。

🚩流量控制(安全机制)

关于该部分的内容博主在《【JavaEE初阶】 TCP滑动窗口与流量控制和拥塞控制》有详细讲解。

🚩拥塞控制(安全机制)

关于该部分的内容博主在《【JavaEE初阶】 TCP滑动窗口与流量控制和拥塞控制》有详细讲解。

🚩延迟应答(效率机制)

如果接收数据的主机立刻返回ACK应答,这时候返回的窗口可能比较小

  • 假设接收端缓冲区为1M。一次收到了500K的数据;如果立刻应答,返回的窗口就是500K;
  • 但实际上可能处理端处理的速度很快,10ms之内就把500K数据从缓冲区消费掉了;
  • 在这种情况下,接收端处理还远没有达到自己的极限,即使窗口再放大一些,也能处理过来;
  • 如果接收端稍微等一会再应答,比如等待200ms再应答,那么这个时候返回的口大小就是1M;

注意:一定要记得,窗口越大,网络吞吐量就越大,传输效率就越高。我们的目标是在保证网络不拥塞的情况下尽量提高传输效率;

那么所有的包都可以延迟应答么?肯定也不是,是存在一定限制的

  • 数量限制:每隔N个包就应答一次;
  • 时间限制:超过最大延迟时间就应答一次;

具体的数量和超时时间,依操作系统不同也有差异;一般N取2,超时时间取200ms
java 解析tcp协议,JavaEE初阶,tcp/ip,java-ee,网络,java,网络协议

🚩捎带应答(效率机制)

在延迟应答的基础上,我们发现,很多情况下,客户端服务器在应用层也是 “一发一收” 的。

意味着客户端给服务器说了 “How are you”,服务器也会给客户端回一个 “Fine, thank you”;

那么这个时候ACK就可以搭顺风车,和服务器回应的 “Fine,thank you” 一起回给客户端
java 解析tcp协议,JavaEE初阶,tcp/ip,java-ee,网络,java,网络协议

🎍面向字节流的粘包问题

首先我们需要明确的是

我们在开发中,创建一个TCP的socket,同时在内核中创建一个 发送缓冲区 和一个 接收缓冲区

  • 调用write时,数据会先写入发送缓冲区中;
  • 如果发送的字节数太长,会被拆分成多个TCP的数据包发出;
  • 如果发送的字节数太短,就会先在缓冲区里等待,等到缓冲区长度差不多了,或者其他合适的时机发送出去;
  • 接收数据的时候,数据也是从网卡驱动程序到达内核的接收缓冲区;
  • 然后应用程序可以调用read从接收缓冲区拿数据;
  • 另一方面,TCP的一个连接,既有发送缓冲区,也有接收缓冲区,那么对于这一个连接,既可以读数据,也可以写数据。这个概念叫做 全双工

由于缓冲区的存在,TCP程序的读和写不需要一一匹配,例如:

  • 写100个字节数据时,可以调用一次write写100个字节,也可以调用100次write,每次写一个字节;
  • 读100个字节数据时,也完全不需要考虑写的时候是怎么写的,既可以一次read 100个字节,也可以一次read一个字节,重复100次;

那什么是粘包问题呢?

  • 首先要明确,粘包问题中的 “包” ,是指的应用层的数据包。

  • 在TCP的协议头中,没有如同UDP一样的 “报文长度” 这样的字段,但是有一个序号这样的字段。

  • 站在传输层的角度,TCP是一个一个报文过来的。按照序号排好序放在缓冲区中。

  • 站在应用层的角度,看到的只是一串连续的字节数据。

  • 那么应用程序看到了这么一连串的字节数据,就不知道从哪个部分开始到哪个部分,是一个完整的应用层数据包。

那么如何避免粘包问题呢?归根结底就是一句话,明确两个包之间的边界

  • 对于定长的包,保证每次都按固定大小读取即可;例如上面的Request结构,是固定大小的,那么就从缓冲区从头开始按sizeof(Request)依次读取即可;
  • 对于变长的包,可以在包头的位置,约定一个包总长度的字段,从而就知道了包的结束位置;
  • 对于变长的包,还可以在包和包之间使用明确的分隔符(应用层协议,是程序猿自己来定的,只要保证分隔符不和正文冲突即可)

🚩思考:

对于UDP协议来说,是否也存在 “粘包问题” 呢?

  • 对于UDP,如果还没有上层交付数据,UDP的报文长度仍然在。同时,UDP是一个一个把数据交付给应用层。就有很明确的数据边界。
  • 站在应用层的站在应用层的角度,使用UDP的时候,要么收到完整的UDP报文,要么不收。不会出现"半个"的情况。

🌴TCP异常情况

进程终止:进程终止会释放文件描述符,仍然可以发送FIN。和正常关闭没有什么区别。

机器重启:和进程终止的情况相同。

机器掉电/网线断开:接收端认为连接还在,一旦接收端有写入操作,接收端发现连接已经不在了,就会进行reset。即使没有写入操作,TCP自己也内置了一个保活定时器,会定期询问对方是否还在。

如果对方不在,也会把连接释放。另外,应用层的某些协议,也有一些这样的检测机制。

例如HTTP长连接中,也会定期检测对方的状态。例如QQ,在QQ断线之后,也会定期尝试重新连接

😎TCP小结

为什么TCP这么复杂?因为要保证可靠性,同时又尽可能的提高性能。

  • 可靠性:

    • 校验和
    • 序列号(按序到达)
    • 确认应答
    • 超时重发
    • 连接管理
    • 流量控制
    • 拥塞控制
  • 提高性能:

    • 滑动窗口
    • 快速重传
    • 延迟应答
    • 捎带应答
  • 其他:

    • 定时器(超时重传定时器,保活定时器,TIME_WAIT定时器等)

🚩基于TCP应用层协议

  • HTTP

  • HTTPS

  • SSH

  • elnet

  • FTP

  • SMTP

当然,也包括你自己写TCP程序时自定义的应用层协议;

⭕总结

关于《【JavaEE初阶】 TCP协议详细解析》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下!文章来源地址https://www.toymoban.com/news/detail-753268.html

到了这里,关于【JavaEE初阶】 TCP协议详细解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【JavaEE初阶系列】——网络初识—TCP/IP五层网络模型

    目录 🚩网络的发展史 🎈局域网LAN  🎈广域网WAN 🚩网络通信基础 🎈IP地址 🎈端口号 🎈协议类型  🎈五元组 🚩协议分层  🎈什么是协议分层 🎈协议分层的好处 🎈OSI七层网络模型 🎈TCP/IP五层网络模型 💻物理层 💻数据链路层 💻网络层 💻传输层  💻应用层 🎈网络

    2024年04月15日
    浏览(39)
  • JAVAEE初阶相关内容第十七弹--网络原理之TCP_IP

    目录 1. TCP-IP五层模型 2. UDP协议 2.1 特点 2.2 UDP协议端格式 2.3 校验和 3. TCP协议 3.1 特点 3.2 TCP协议段格式 3.2.1 首部长度 3.2.2 选项 3.2.3 保留6位 3.3 TCP内部的工作机制 3.3.1 确认应答 (1)应答报文ack (2)小结 3.3.2 超时重传 3.3.3 连接管理 3.3.4 滑动窗口 窗口大小 3.3.5流量控制 3

    2024年01月18日
    浏览(45)
  • javaEE -9(7000字详解TCP/IP协议)

    IP协议有两个版本: IPv4 IPv6。 IPv4数量=2^32,大约43亿左右,而TCP/IP协议规定,每个主机都需要有一个IP地址。对于全世界计算机来说,这个数量是不够。 所以后来推出了IPv6(长度128位,是IPv4的4倍)。但因为目前IPv4还广泛的使用,且可以使用其他技术来解决IP地址不足的问题

    2024年02月06日
    浏览(38)
  • JAVAEE初阶相关内容第十九弹--网络原理之TCP_IP【续集2】

    上一篇博客主要介绍的是关于网络层协议-IP协议的重点介绍。需要掌握关于IP协议的协议头格式,关于IPV4分配不够的解决办法。地址管理与路由选择。 点击跳转上一篇博客 本篇博客将继续学习关于计网中协议的内容。 本篇博客主要介绍关于数据链路层的重点协议-以太网。

    2024年02月03日
    浏览(34)
  • 【Java EE 初阶】TCP协议的安全效率机制

    目录 1.应用层协议 2.传输层协议 3.UDP协议格式 4.TCP协议格式 5.TCP的安全效率机制 1.确认应答机制 2.超时重传机制 但是,主机A未收到B发来的确认应答,也可能是因为ACK丢失了; 3.连接管理机制 ​编辑 面试题:会不会有可能变成三次挥手? 面试题:第二个FIN丢包了如何处理?

    2024年02月09日
    浏览(44)
  • 解析TCP/IP协议的分层模型

    了解ISO模型:构建通信的蓝图 为了促进网络应用的普及,国际标准化组织(ISO)引入了开放式系统互联(Open System Interconnect,OSI)模型。这个模型包括了七个层次,从底层的物理连接到顶层的应用程序,为网络通信的不同方面提供了统一的架构,包含从物理层到应用层的层次

    2024年02月12日
    浏览(36)
  • 解析pcap文件,逐步认识tcp/ip协议栈

    TCP/IP(Transmission Control Protocol/Internet Protocol)定义了一组规范和协议,用于在计算机网络中实现数据通信。 协议栈,或称TCP/IP 协议栈,是该网络簇下网络协议实现的集合,也是现代互联网的基础。 TCP/IP 协议栈由多个层级组成,每个层级负责处理特定的网络功能。它与 OSI 模

    2024年02月09日
    浏览(38)
  • 【JavaEE初阶】 TCP服务器与客户端的搭建

    TCP服务器与客户端的搭建需要借助以下API TCP之间通信通过流进行传输,无论是服务器还是客户端:读取内容用输入流,写入内容用输出流 ServerSocket 是创建TCP服务端Socket的API。 ServerSocket 构造方法 : 方法签名 方法说明 ServerSocket(int port) 创建一个服务端流套接字Socket,并绑定

    2024年02月05日
    浏览(41)
  • 第138篇:了解HTTP协议(TCP/IP协议,DNS域名解析,浏览器缓存)

    好家伙,发现自己的网络知识十分匮乏,赶紧补一下   这里先举个我生活中的例子 欸,作业不会写了,上网搜一下 用edge浏览器上bing必应搜一下(百度广告太多了,真不想用百度举例子)   假设这是我们第一次访问bing的首页 当我向浏览器中输入https://cn.bing.com/并按下回车

    2023年04月24日
    浏览(50)
  • JavaEE 初阶篇-深入了解 UDP 通信与 TCP 通信(综合案例:实现 TCP 通信群聊)

    🔥博客主页: 【 小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录         1.0 UDP 通信         1.1 DatagramSocket 类         1.2 DatagramPacket 类         1.3 实现 UDP 通信(一发一收)         1.3.1 客户端的开发         1.3.2 服务端的开发         1.4 实

    2024年04月26日
    浏览(43)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包