【Java八股-第十七期】TCP模型 - 计算机网络

提纲:

🔥TCP模型

  • TCP首部字段

  • 三次握手

  • 四次挥手

  • TCP粘包与拆包

  • TCP的可靠传输

  • 拥塞算法

🎈面试八股真题——【Java八股-第十九期】Socket 统一总结

一、TCP模型

1. TCP首部字段

  • 1、源端口号与目标端口号

  • 2、序列号SN:表示当前发送的字节流数据第一个字节的编号

  • 3、确认号ACK:表示从确认号N之前的数据都已接收完毕

  • 4、控制位

    • SYN:表示建立连接请求

    • ACK:表示ACK确认号是否有效

    • FIN:表示终端连接请求

    • URG:表示紧急数据包,不会在缓冲中等待

    • PSH:表示将本数据包与缓冲中所有数据包发出

    • RST:表示连接出错,需要重新连接

  • 5、校验和——校验数据在传输过程中是否发生改变

  • 6、滑动窗口——由接收方根据流量控制(当前接收方缓冲区剩余大小)与拥塞控制(全局网络拥塞情况)计算得到,用来限制发送方单次传输数据大小上限,防止数据在传输过程中因接收能力丢失

2.三次握手

  • 1、客户端向服务端发送一个控制位ACK=0,SYN=1的数据包表示请求建立连接,发送后客户端进入SYN-SENT状态

  • 2、服务端接收到数据包后,分配缓存空间,并返回给客户端一个ACK=1,SYN=1的数据包,确认号ack为客户端数据包序列号加一,服务端进入SYN-RCVD状态

  • 3、客户端接收到数据包后,返回给客户端ACK=1的数据包,进入Establish状态,传输连接正式建立

3.四次挥手

  • 1、客户端完成所有数据传输,向服务端发送一个FIN=1的终止连接报文,并设置序列号为传输数据的最后一个字节序号,发送后客户端进入FIN-Wait一阶段

  • 2、服务端接收到终止连接报文,并返回给客户端一个ACK确认报文,此时客户端进入FIN-Wait二阶段,客户端无法再进行数据传输,然而服务端可能还存在没有发送给客户端的数据,因此不能立刻关闭连接

  • 3、服务端在发送完所有数据后,再发送一个ACK=1,FIN=1的终止确认给客户端,此时服务端进入LAST-ACK状态

  • 4、客户端收到响应后,返回给服务端一个ACK=1的响应,并进入TIME-WAIT状态,等待时间为2MSL,即两倍的最大数据段传输时间

4.TCP粘包与拆包

  • UDP基于用户数据报传输,给多少发多少,并在首部记录了数据包长度,不存在粘包问题

  • TCP是基于报文段的字节流传输,在传输时会根据发送缓冲区剩余大小将一个大的应用层数据包拆成多个数据段,或将多个小包粘成一个数据段传输,从而造成数据的边界模糊问题

  • TCP报文段长度还收到MSS,即最大报文长度控制,MSS = MTU - IP首部 - TCP首部,MTU即最大数据长度,一个以太网帧数据长度为1518字节(MTU=1500)

  • 解决方法

    • 1、在数据包结尾添加标识符:FTP协议

    • 2、每次发送固定长度的数据包,不足的部分用0比特填充

    • 3、在数据包首部添加数据长度

5.TCP的可靠传输

  • 1、客户端与服务端通过三次握手确认连接,确保双方收发功能正常

  • 2、应答机制:即发送方通过isn序列号告知接收方数据顺序,接收方通过返回

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

代码鹿のJAVA八股面试题总结 文章被收录于专栏

【📫专栏目录在最底部📫】 - 本专栏适合于JAVA已经入门的学生或人士,有一定的编程基础。 - 本专栏特点: 本专刊囊括了JAVA、Spring、计算机网路、操作系统、计算机网络、MySQL、算法与数据结构、中间件等一系列知识点,总结出了高频面试考点(附有答案),事半功倍,为大家春秋招助力。 - 本专栏内容分为五章

全部评论
有些地方写错了吧,不检查一下吗
点赞 回复 分享
发布于 2022-07-16 11:49
最后一句,是不是写反了。窗口小于慢开始门限的时候,用的是慢开始算法吧
点赞 回复 分享
发布于 2022-07-12 22:01
拥塞算法快重传写错了吧,应该是重传丢失的数据,ACK = 23801 的 ACK 包代表23801的数据已经被接收方收到了,怎么还会重传呢?
点赞 回复 分享
发布于 2022-07-08 01:35

相关推荐

09-02 11:14
已编辑
四川大学 Java
吴offer选手:这种面试是最烦的,学不到东西,然后还被挂的莫名其妙。之前看到一种说法是面试官如果不想要你了,就会问一些很简单的问题,防止你举报他
点赞 评论 收藏
分享
从大一开始就开始学习Java,一路走来真的不算容易,每次面试都被压力,不过这次终于达成了自己的一大心愿!时间线和面经:8.17-投递9.1-一面实习+项目拷打看门狗机制讲一下redis加锁解锁的本身操作是什么Lua脚本是干什么的udp和tcp讲一下流量控制讲一下令牌桶算法说一下大端和小端是什么线程和协程有什么区别怎么切换协程切换的时候具体做了什么对于程序来说,你刚才提到的保存和恢复现场,这个现场有哪些信息udp优势现在有一个客户端和服务端,要实现TCP的通信,我们的代码要怎么写服务器怎么感知有新的连接怎么处理多个客户端的请求连接TCP怎么处理粘包和分包现在有两个文件,然后每个文件都有一亿条URL,每个的长度都很长,要怎么快速查找这两个文件共有的URLHashmap底层说一下怎么尽量提升插入和查询的效率如果要查找快,查询快,还有解决非空的问题,怎么做LoadingCache了解吗手撕:堆排序9.4-二面部门的leader,超级压力面拷打实习+项目,被喷完全没东西类的加载到垃圾回收整个底层原理讲一遍类加载谁来执行类加载器是什么东西,和进程的关系Java虚拟机是什么东西,和进程的关系如果我们要执行hello world,那虚拟机干了什么呢谁把字节码翻译成机器码,操作时机是什么Java虚拟机是一个执行单元吗Java虚拟机和操作系统的关系到底什么,假如我是个完全不懂技术的人,举例说明让我明白一个操作系统有两个Java程序的话,有几个虚拟机有没有单独的JVM进程存在启动一个hello world编译的时候,有几个进程JVM什么时候启动比如执行一条Java命令的时候对应一个进程,然后这个JVM虚拟机到底是不是在这个进程里面,还是说要先启动一个JVM虚拟机的进程垃圾回收机制的时机能手动触发垃圾回收吗垃圾回收会抢占业务代码的CPU吗垃圾回收算法简单说说垃圾回收机制的stop the world存在于哪些时机垃圾回收中的计算Region的时候怎么和业务代码并行执行假如只有一个线程,怎么实现并行Java为什么要这么实现Java效率比C++慢很多,那为什么还要这样实现Java虚拟机到底是什么形式存在的说一下Java和C++的区别还有你对Java设计理念的理解无手撕面试结束的时候,我真的汗流浃背了,面试官还和我道歉,说他是故意压力面想看看我的反应的,还对我给予了高度评价:我当面试官这么多年,你是我见过最好的一个9.9-三面临时通知的加面,就问了三十分钟项目9.11-hr面问过往经历,未来计划,想从腾讯实习中得到什么?当场告知leader十分满意我,所以直接ochr面完一分钟官网流程变成录用评估中,30分钟后mt加微信告知offer正在审批9.15-offer这一次腾讯面试体验真的不错,每个面试官能感觉到专业能力很强,反馈很足,比起隔壁某节真是好太多以后就是鹅孝子了
三本咋了:当面试官这么多年你是我见过的最好的一个
你面试被问到过哪些不会的...
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务