TCP详解及面试相关问题
文章目录
- 1、计算机模型
- 2、客户端和服务端通信——TCP协议
- (1)socket套接字
- (2)TCP三次握手——创建socket
- (3)连接的本质
- (4)TCP四次挥手——释放socket资源
- (5)TCP的滑动窗口机制及重传机制
- (6)发送方窗口
- (7)接收方窗口
- 3、TCP常见问题
- (1)什么是半连接队列?
- (2)什么是自动重传?
- (3)ISN(Initial Sequence Number)是固定的吗?
- (4)三次握手过程中可以携带数据吗?
- (6)SYN攻击是什么?
- (7)挥手为什么需要四次?
- (8)四次挥手释放连接时,等待2MSL的意义?
- (9)TIME_WAIT状态过多有什么危害?
- (10)如何解决TIME_WAIT状态过多?
1、计算机模型
- 用户空间:应用层(会话层、表示层)
- 内核空间:传输层(TCP/UDP)、网络层、数据链路层、物理层
2、客户端和服务端通信——TCP协议
- 应用层组织好HTTP请求数据——用户空间
- 请求行:请求数据的第一行。其中GET表示请求方式, / 表示请求资源路径,HTTP/1,1表示协议版本
- 请求头:第二行开始,格式为key:value形式
- 请求体:POST请求的最后一部分,存放请求参数
- 传输层建立连接——内核空间
- TCP是面向连接的、可靠的传输层协议
- 发送数据
- 断开连接
(1)socket套接字
socket套接字是TCP/IP协议的网络通信的基本操作单元,包含了五中信息:
- 连接使用的协议
- 本地主机的IP地址
- 本地进程的协议端口
- 远程主机的IP地址
- 远程主机进程的协议端口
(2)TCP三次握手——创建socket
-
客户端发送SYN请求给服务端,SYN(i),客户端进入SYN_SEND(发送)状态等待服务器确认
-
服务端收到客户端的连接请求后,给客户端发送SYN(j)+ACK(i+1)响应,服务端进入SYN_RECEIVDE(接收)状态
-
客户端收到服务端的响应后,给服务端发送ACK(j+1)响应,客户端和服务端进入ESTABLISHED(连接)状态
所谓的HTTP长链接、短连接的本质其实是TCP的长短连接
(3)连接的本质
-
三次握手成功后,通信双方会在各自内核空间开辟一些资源。比如:发送队列和接收队列
-
客户端用户要读取服务端资源,不是直接和服务器直接对接(客户端的读取和服务端的发送时异步的)。内核收到服务器的数据后,放到接收队列里面去。然后用户再去内核的接收队列中取数据——即IO模型。
连接是通信双方内核的传输层去建立的,即socket的创建。数据的发送和接收是用户层和内核之间(socket套接字)的交互。
思考:一个本地进程可以跟一个目标进程建立多少个连接呢?
答:操作系统中端口号是16位,如果确定了本地IP和端口、以及目标IP和端口、理论上是能创建65535条,但是一般操作系统对可用端口做了限制(比如:1024~65535)。那么我可以再插一个网卡,换一个IP或者端口,就可以再创建这么多连接。这样下去,是不是就能创建越来越多的连接了?
当然不是,每一个连接都是一个文件描述符。当达到操作系统允许创建的最大描述符个数时,就会创建失败。此外,创建连接,还需要消耗cpu、内存、线程资源。所以这几项都会对创建的socket连接数做出限制。
(4)TCP四次挥手——释放socket资源
在断开连接之前客户端和服务器都处于ESTABLISHED状态,双方都可以主动断开连接,以客户端主动断开连接为优。
第一次挥手:客户端打算断开连接,向服务器发送FIN(1)报文,FIN报文中会指定一个序列号 seq = x,之后客户端进入FIN_WAIT_1状态。
报文为:FIN = 1 ,序列号seq = x 。
第二次挥手:服务器收到释放报文(FIN)后,就向客户端发送ACK(x + 1,应答报文。同时发送 seq = y。服务器进入CLOSE_WAIT(等待关闭)状态,此时的TCP处于半关闭状态,客户端到服务器的连接释放。客户端收到来自服务器的ACK应答报文段后,进入FIN_WAIT_2状态。
报文为:ACK = 1 , 序列号seq = y, 确认序列号ack = x + 1。
第三次握手:服务器也打算断开连接,向客户端发送连接释放(FIN)报文段,之后服务器进入LASK_ACK(最后确认)状态,等待客户端的确认。
报文为:FIN=1,ACK=1,序列号seq=m,确认序列号ack=u+1。
第四次握手:客户端收到来自服务器的连接释放(FIN)报文段后,会向服务器发送一个ACK应答报文段。
报文为:ACK = 1 , seq = u + 1 , ack = m + 1
之后客户端进入TIME_WAIT(时间等待)状态,服务器收到ACK应答报文段后,服务器就进入CLOSE(关闭)状态,到此服务器的连接已经完成关闭。
客户端处于TIME_WAIT状态时,此时的TCP还未释放掉,需要等待2MSL后,客户端才进入CLOSE状态。
(5)TCP的滑动窗口机制及重传机制
加入A发送了一个数据包,需要等到接收到B的确认报文后,才可以继续发送下一个报文是不是效率就比较慢。所以就引入了滑动窗口。
滑动窗口的本质:在发送方开启一个数据缓冲区,可以一次性发送n个报文,并放到缓冲区里面,接收端收到这些收据后,会给发送方一个应答。发送方等收到接收端的确认后,再讲数据从缓冲区删掉。一次性可以发送的最大报文数n就被成为窗口大小。
注意:窗口大小是发送方决定的,如果一次发送n条数据,而服务器此时只能处理m(m < n)条数据,此时是不是就会出问题。所以窗口大小是接收方根据自己的处理能力决定的。
那么一次性传多个报文,当遇到丢包怎么办?——TCP确认重传机制
- 比如A一次发了0~1000的报文给B,那么B给出的应答就是1001,表示前面1000个数据已经收到了,下一个报文应该是1001。
- 这时A又连续发10002000和20003000的报文给B,但是10002000的报文丢了,B没有收到。而收到了20003000的数据,那么接下来三次给A的应答都将是1001,表示应该为1001的数据丢失了。
- A后面连续三次收到了3次来自B的形同的响应1001,就知道1001~2000的数据丢失了,就会重传
(6)发送方窗口
接收窗口被划分为4个部分:
- 数据已被发送并且接收到ACK
- 数据已被发送但没有接收到ACK
- 数据未发送但在接收方处理能力范围之内
- 数据未发送并且不在接收方处理能力范围之内
窗口是如何滑动的?
-
当接收方返回4个确认应答,那么发送窗口就向右移动4个位置,同时窗口的每个部分都在同时变化.
-
这里注意如果发送方一下把数据全部发送,可用窗口大小就为0,那么就无法再次发送数据,需要等待接收方确认应答腾出窗口大小才能发送数据
(7)接收方窗口
接收窗口分为3个部分
- 已经成功接收,并且已经被接收方确认的数据
- 还没有收到的数据,但是可以接收
- 没有接收到的数据,还不可以被接收
接收的窗口大小与发送的窗口大小是完全相等的么?
可以认为是约等于的关系,把数据放到接收缓冲区里面还需要应用进程来进行读取,如果应用进程读取数据过快,接收缓冲区很快就空了,接收窗口很快就空出来,这时还要将新窗口的大小需要通过TCP的Windows字段告诉我们,这个传输过程存在时延迟,所以不是完全相等的.
3、TCP常见问题
(1)什么是半连接队列?
服务器第一次收到客户端的连接请求SYN时,会进入待连接状态SYN_RCVD。还没有完全建立连接。然后将此连接放入到一个队列里,这就是半连接对列。
(2)什么是自动重传?
当客户端法送了SYN请求后,如果迟迟没有收到服务器的回复,就会不断的重新发送连接请求。当重传次数到达系统规定的最大重传次数时,就会从半连接状态中删除。重传的时间间隔一般呈指数增加,比如:1s、2s、4s、8s……
(3)ISN(Initial Sequence Number)是固定的吗?
建立连接的初始序列不能是固定的。比如A用seq = 1向B发起了连接请求,当连接后,使用seq=1向B发送了100k数据,假设此时网络出故障了,这100k数据没有阻塞在网络中。刚好A重启了,之后又以seq = 1连接B,向B发了200K数据。此时,之前的100k数据也到达了B端。但是这时B还将这100k数据当做是新连接之后发的数据,是不是就有问题了。
可以避免数据乱序问题
(4)三次握手过程中可以携带数据吗?
第三次是可以的,但是前两次不行,因为前两次不知道对方的状态,比如此时服务器cpu已经满了,但是客户端还恶意的不断去发送大量数据,服务器就会分配资源来存储处理,可能会导致服务器崩溃。而最后一次是知道对方状态的,所以可以携带数据
(6)SYN攻击是什么?
服务端的连接是在第二次挥手时建立的,客户端是在第三次建立的。如果有客户端使用不存在的IP地址,向同一台服务器不断的发大量的SYN连接请求,服务器就会不停的回复确认报文,由于地址是不存在的,所以服务端每次发送的报文都不会得到确认,就会一直重传直到次数达到最大值。这就导致浪费大量的服务器资源,而使得正常的连接得不到资源而被丢弃。这就是洪泛攻击。
防止洪泛攻击的方法:
-
增大最大半连接数
-
缩短超时时间
-
SYN cookies技术
-
SYN cookies技术
服务器在第二次连接的时候,会将连接加入到半连接对列,等收到确认报文后,从半连接对列删除后,才认为建立成功。而开启SYN cookies不需要半连接对列,也会建立连接,具体做法是:
第二次挥手时,服务器会根据当前的状态,算出一个cookies值发给客户端,客户端在发送确认报文时,会携带这个值,服务器收到后进行校验,校验成功就会连接成功。
(7)挥手为什么需要四次?
当客户端的数据发送完后,发起断开连接请求,当收到服务端的确认后,就可以断开客户端的连接。但是此时还可以接收到服务器的数据。此时处于半关闭状态。但是此时服务器可能还有数据没有发送完成,所以等到服务器发完数据后,再向客户端发起断开连接请求。收到确认报文后,才会断开连接。
(8)四次挥手释放连接时,等待2MSL的意义?
MSL表示报文再网络环境中能存在的最长时间。如果第四次挥手后,客户端直接关闭,而它发出的确认报文丢失了,服务器就会因为收不到这个报文而等待。所以第四次挥手后,不能直接关闭,如果发出去的确认服务端没有收到,服务端就会重新进行第三次挥手,客户端再次做出确认报文。
(9)TIME_WAIT状态过多有什么危害?
浪费系统资源,如果服务端的TIME_WAIT状态过多,就会占用过多的端口资源得不到释放。占满了所有端口后,就无法创建新的连接了。
(10)如何解决TIME_WAIT状态过多?
- 最好是让客户端主动断开
- 对TIME_WAIT状态最大数做出限制,达到最大值时,将会被清理掉
- 短连接改为长链接
相关文章:
TCP详解及面试相关问题
文章目录1、计算机模型2、客户端和服务端通信——TCP协议(1)socket套接字(2)TCP三次握手——创建socket(3)连接的本质(4)TCP四次挥手——释放socket资源(5)TC…...
LVGL V9.0基于VS2022仿真搭建
完整Demo,lvgl,lvgl_drivers相关资料下载 链接:https://pan.baidu.com/s/1DNJeHdoaPyfe1BsLb9wjRg 提取码:wov7 其它资料下载 链接:https://pan.baidu.com/s/1nV9jojPEPWSWZdYhaCZWTA 提取码:91j8 下载资料后解压文…...
多线程面试题开胃菜2(5道)
一.一个线程的生命周期有哪几种状态?它们之间如何流转的?NEW:毫无疑问表示的是刚创建的线程,还没有开始启动。RUNNABLE: 表示线程已经触发 start()方式调用,线程正式启动,线程处于运行中状态。BLOCKED&…...
第三次作业
一、单表查询素材: 表名:worker-- 表中字段均为中文,比如 部门号 工资 职工号 参加工作 等CREATE TABLE worker (部门号 int(11) NOT NULL,职工号 int(11) NOT NULL,工作时间 date NOT NULL,工资 float(8,2) NOT NULL,政治面貌 varchar(10) N…...
基础算法(直接插入,希尔排序,快排,归并,折半查找)
/*直接插入:把待排序序列分为有无序区和和无序区,使用无序区的数据一次插入倒有序区中,最终结果尾有序序列 1> 把数据分为有序区和无序区,默认第一个元素在有序区,剩下在无序区 2> 外层循环,循环无…...
电子学会2022年12月青少年软件编程(图形化)等级考试试卷(一级)答案解析
目录 一、单选题(共25题,共50分) 二、判断题(共10题,共20分) 三、编程题(共2题,共30分) 青少年软件编程(图形化)等级考试试卷(一级) 一、单选题(共25题,共50分) 1. 小明想在开始…...
基于JAVA的超级玛丽设计与实现
技术:Java等摘要:随着计算机技术及网络技术的不断发展,电子游戏越来越普及。经典游戏“超级玛丽”因其本身所具有的娱乐性与教育意义而被人们广泛接受,在广大的青少年玩家中享有极高的知名度。Java语言作为一种完全面向对象的程序…...
硬件工程师入门基础知识(一)基础元器件认识(二)
硬件工程师入门基础知识 (一)基础元器件认识(二) tips:学习资料和数据来自《硬件工程师炼成之路》、百度百科、网上资料。 1.二极管 2.三极管 3.MOS管 4.IGBT 5.晶振 1.二极管 肖特基二极管和硅二极管的比较&#…...
Python-项目实战--贪吃蛇小游戏-游戏框架搭建(2)
1.游戏框架搭建介绍pygame开发图像界面游戏的几个要素,并且把贪吃蛇游戏的整体框架搭建完成本节知识点包括:pygame的初始化和退出游戏主窗口游戏循环和游戏时钟主窗口背景颜色绘制文本pygame的坐标系游戏事件监听绘制图形定时器事件1.1pygame的初始化和退…...
JVM基础
JVM基础 1.JVM的位置 JVM是运行在操作系统之上的,它与硬件没有直接的交互 2.JVM体系结构图 这个区域一定不会有垃圾回收 所谓JVM的调优,其实就是在调这个区域,而且99%情况下都在调堆 ! 3.类加载器ClassLoader 先来看看一个类加载到 JVM 的…...
Android 内存优化(基础轮)必看~
本次分享主要分为五个部分内容,第一部分内容是 5W2H 分析内存优化,第二部分内容是内存管理机制,第三部分内容是内存优化 SOP,第四部分内容是 内存优化指导原则, 最后一部分内容是总结与展望。 如果学完内存优化的基础论…...
STM32单片机GSM短信自动存取快递柜
实践制作DIY- GC0104-自动存取快递柜 一、功能说明: 基于STM32单片机设计-自动存取快递柜 二、功能介绍: STM32F103C系列最小系统板0.96寸OLED显示器DY-SV17F串口语音播报模块4*4矩阵键盘GSM短信模块4路舵机(模拟4个柜子) ***…...
力扣(LeetCode)410. 分割数组的最大值(2023.02.12)
给定一个非负整数数组 nums 和一个整数 m ,你需要将这个数组分成 m 个非空的连续子数组。 设计一个算法使得这 m 个子数组各自和的最大值最小。 示例 1: 输入:nums [7,2,5,10,8], m 2 输出:18 解释: 一共有四种方法…...
管理还原数据
还原数据还原数据是:• 原始的、修改之前的数据副本• 针对更改数据的每个事务处理而捕获• 至少保留到事务处理结束• 用于支持:– 回退操作– 读取一致性查询– Oracle 闪回查询、Oracle 闪回事务处理和 Oracle 闪回表– 从失败的事务处理中进行恢复存…...
c的关键字有那些
编程语言中的关键字 C语言简洁、紧凑,使用方便、灵活。ANSI C标准C语言共有32个关键字,9种控制语句,程序书写形式自由,区分大小写。把高级语言的基本结构和语句与低级语言的实用性结合起来。 C 语言可以像汇编语言一样对位、字节和…...
链表OJ(一)
目录 从尾到头打印链表_牛客题霸_牛客网 160. 相交链表 141. 环形链表 142. 环形链表 II 138. 复制带随机指针的链表 从尾到头打印链表_牛客题霸_牛客网 输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。 如输入…...
MySQL第三次作业
1、显示所有职工的基本信息。 2、查询所有职工所属部门的部门号,不显示重复的部门号。 3、求出所有职工的人数。 4、列出最高工和最低工资。 5、列出职工的平均工资和总工资。 6、创建一个只有职工号、姓名和参加工作的新表,名为工作日期表…...
Python中的类和对象(7)
1.私有变量 在大多数面向对象的编程语言中,都存在着私有变量(private variable)的概念,所谓私有变量,就是指通过某种手段,使得对象中的属性或方法无法被外部所访问。 Python 对于私有变量的实现是引入了一…...
【JVM】7种经典的垃圾收集器
文章目录1. 垃圾收集器概述2. Serial 收集器3. ParNew 收集器4. Paraller Scavenge 收集器5. Serial Old收集器6. Parller Old收集器7. CMS 收集器8. Garbage First 收集器本文参考:深入理解Java虚拟机:JVM高级特性与最佳实践(第3版ÿ…...
2023/2/12总结
滑动窗口(1)滑动窗口是一种基于双指针的思想,两个指针指向的元素形成一个窗口。一般用于求取数组或字符串的某个子串、子序列、最长最短等最值或者求某个目标值时,并且该问题本身可以通过暴力解决。滑动窗口分为固定窗口和不定窗口…...
Linux之正则表达式
正则表达式是组成“操作”的基本语法,而这些“操作”是应用于Sed和Awk必备的能力。因此只有了解了正则表达式,才能学好Sed和Awk。正则表达式分为基础正则表达式(Regular Expression)与扩展正则表达式(Extended Regular…...
前端高频面试题-HTML和CSS篇(一)
💻 前端高频面试题-HTML和CSS篇(一) 🏠专栏:前端面试题 👀个人主页:繁星学编程🍁 🧑个人简介:一个不断提高自我的平凡人🚀 🔊分享方向…...
Redis 专题总结
1. 什么是Redis ? 处理:内容缓存,主要用于处理大量数据的高访问负载。Redis是一款高性能的NOSQL系列的非关系型数据库,NoSQL(NoSQL Not Only SQL),意即“不仅仅是SQL”,是一项全新的数据库理念࿰…...
【Python百日进阶-Web开发-Vue3】Day515 - Vue+ts后台项目2:登录页面
文章目录 一、创建登录路由1.1 安装 Vue VSCode Snippets插件1.2 处理路径引用的红色波浪线1.3 入口文件 main.ts1.4 主组件 App.vue1.5 路由文件 router/index.ts1.6 首页组件 views/HomeView.vue1.7 登录组件 views/LoginView.vue二、实现登录页面的表单展示2.1 element-plus…...
【博客620】prometheus如何优化远程读写的性能
prometheus如何优化远程读写的性能 场景 为了解决prometheus本地存储带来的单点问题,我们一般在高可用监控架构中会使用远程存储,并通过配置prometheus的remote_write和remote_read来对接 远程写优化:remote_write 远程写的原理:…...
redis可视工具AnotherRedisDesktopManager的使用
redis可视工具AnotherRedisDesktopManager的使用 简介 Another Redis DeskTop Manager 是一个开源项目,提供了以可视化的方式管理 Redis 的功能,可供免费下载安装,也可以在此基础上进行二次开发,主要特点有: 支持 W…...
【idea】idea生产类注释和方法注释
网上有很多类似的文章,但是我在按照他们的文章设置后,出现了一些问题,因此我这边在解决了问题后,总结一篇文章,发出来给大家借鉴一下。在此先说明一下idea的版本,是2020.1.3 设置动态模板,File…...
jenkins +docker+python接口自动化之jenkins容器安装python3(二)
jenkins dockerpython接口自动化之jenkins容器安装python3(二) 目录:导读 前提是在docker下已经配置好jenkins容器了,是将python安装在jenkins容器下的 1、先看你的jenkins是否安装好 2、以root权限进入jenkins容器࿱…...
go 命令行工具整理
这里会整理可能会使用到的命令行参数,比如 go build、go run,诸如此类。了解这些内容对我们工作会有什么帮助吗?更多的时候,是能让我们理解代码编译的意图,或者,给我们一种排查问题的手段。 比方说&#x…...
RuntimeError: CUDA out of memory
今天在训练模型的时候突然报了显存不够的问题,然后分析了一下,找到了解决的办法,这里记录一下,方便以后查阅。 注:以下的解决方案是在模型测试而不是模型训练时出现这个报错的! RuntimeError: CUDA out of…...
怎么做教育类型的网站/seo优化培训班
一、“平面设计”的内涵 • 所谓“平面设计”,指的是在平面空间上的设计活动,其设计的内容主要是在二维空间中各个元素的设计和这些元素组合的布局设计,其中包括字体设计、版面设计、插图、摄影的采用,而所有这些内容的核心在于传…...
做网站的疑问有哪些/新闻播报最新
如何对PHP程序中的常见漏洞进行攻击(上) 文章属性:翻译 文章来源:httpwww.china4lert.org 文章提交:analysist (analysist_at_china.com) 如何对PHP程序中的常见漏洞进行攻击(上) 原著ÿ…...
能发外链的网站/seo线上培训班
没有使用igraph库哦 因为我还没学小世界网络简介:1998年, Watts和Strogatz 提出了小世界网络这一概念,并建立了WS模型。实证结果表明,大多数的真实网络都具有小世界特性(较小的最短路径)和聚类特性(较大的聚类系数)。传统的规则最近邻耦合网络…...
乌鲁木齐市做平台网站/免费seo教程资源
👏👏👏 哈喽!大家好,我是【学无止境小奇】,一位热爱分享各种技术的博主!😍😍😍 ⭐【学无止境小奇】的创作宗旨:每一条命令都亲自执行过…...
做网站的技术支持/网站排名优化软件哪家好
什么是RDD:RDD叫做分布式数据集,是Spark最基本的数据抽象,代码中是一个抽象类,它代表的是一个不可变、可分区、里面的元素可并行计算的集合。RDD里面封装的是计算逻辑。RDD的属性:1. 一个分区(Partition),即数据集的基…...
网站建设 河南/网站推广优化外包公司
场景:三个线程t1、t2、t3。确保三个线程顺序执行,t1执行完后t2执行,t2执行完后t3执行。 1、使用join thread.Join 把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程 B 中调用了线程 A 的 …...