Tcp三次握手,四次挥手

http://www.cnblogs.com/zmlctt/p/3690998.html

三次握手为建立连接,四次挥手为终止连接

一、Tcp报文格式
TCP/IP协议的详细信息参看《TCP/IP协议详解》三卷本。下面是TCP报文格式图:

上图中有几个字段需要重点介绍下:
   (1)序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
   (2)确认序号:Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。
   (3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:
     (A)URG:紧急指针(urgent pointer)有效。
     (B)ACK:确认序号有效
     (C)PSH:接收方应该尽快将这个报文交给应用层。
     (D)RST:重置连接。
     (E)SYN:发起一个新连接
     (F)FIN:释放一个连接
   需要注意的是:
       (A)不要将确认序号Ack与标志位中的ACK搞混了。
       (B)确认方Ack=发起方Req+1,两端配对。 
二、三次握手
目的:连接服务器制定端口,建立Tcp连接,同步连接双发的序列号和确认好并交换Tcp窗口大小信息。在socket编码中,客户端执行connect()时,触发三次握手。



第一次握手:客户端发送一个SYN标志位1的包,表明客户打算连接服务器的端口,以及初始序号X,保存在包头的序列号字段里。
(客户端发起一个建立连接的请求SYN=1) Client进入SYN_SENT状态,等待Server确认
第二次握手: 服务器发回确认包(ACK)应答。即SYN标志位和ACK标志位均为1,将确认序号(Acknowledgement Number)设置为客户的ISN加1,即X+1。
(服务器收到客户端发送的建立连接请求后,发送确认包给服务器表示我收到你的请求,且我同意建立连接 。)Server进入SYN_RCVD状态
第三次握手: 客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1.并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段上的ISN+1
(客户端确认ack是否为初始序号X+1,ACK是否为1,如果正确则建立连接成功)Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。


SYN攻击:是指在三次握手的过程中,完成两次握手后的状态称为半连接状态, 此时Server处于SYN_RCVD状态,此时发生攻击是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server回复确认包,并等待Client的确认,由于源地址是不存在的,因此,Server需要不断重发直至超时,这些伪造的SYN包将产时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络堵塞甚至系统瘫痪。SYN攻击时一种典型的DDOS攻击,检测SYN攻击的方式非常简单,即当Server上有大量半连接状态且源IP地址是随机的,则可以断定遭到SYN攻击了,使用如下命令可以让之现行:
 #netstat -nap | grep SYN_RECV

一般较新的TCP/IP协议栈都对这一过程进行修正来防范Syn攻击,修改tcp协议实现。主要方法有SynAttackProtect保护机制、SYN cookies技术、增加最大半连接和缩短超时时间等.
但是不能完全防范syn攻击。

三、四次挥手

TCP的连接的拆除需要发送四个包,因此称为四次挥手(four-way handshake)。客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。



由于Tcp是全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方没有数据发送任务后,发送一个FIN来终止该方的连接,此后该方不可在发送数据给另一方,但此方仍可以接收数据,因为另一方并未终止连接。当另一方也发送FIN后,TCP连接才断开。首先进行关闭的一方式主动关闭,另一方执行被动关闭。
第一次挥手: Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态
第二次挥手: Server收到FIN后 ,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态
第三次挥手: Server发送一个FIN ,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态
第四次挥手: Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1 Server进入CLOSED状态, 完成四次挥手。
四、问题题
1、为什么建立连接是三次握手,而关闭连接却是四次挥手呢?

这是因为服务端的LISTEN状态下的SOCKET,当收到SYN报文的连接请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可能未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。
(建立连接时,第二次握手服务器把ACK应答报文和SYN同步报文放在一个包里面发送,但第二次挥手和第三次挥手分开是因为断开是双方分别断开,一方断开另一方,仍然可以给他发送数据的,所以需要先发送确认收到你要断开的报文,再在我方数据发送完毕后发送FIN报文通知断开连接。)

2、TCP与UDP的区别是什么
(1)TCP协议是 有连接的,有链接的意思是开始传输实际数据之前TCP的客户端和服务器端必须通过三次握手建立连接,会话结束之后也要结束连接,而UDP是无连接的。
(2)TCP协议保证数据 按序发送,按序接收,提供超时重传来保证可靠性,但是UDP不保证按序到达,甚至不保证到达,只是努力交付,即便是按序发送的序列,也不保证按序送到。
(3)TCP所需资源比UDP多,TCP收不需要20个字节,UDP首部只需要8个字节。
(4)TCP有流量控制和拥塞控制,UDP没有,网络拥堵不会影响发送端的发送速率,
(5)TCP是 一对一的连接,而UDP可以支持一对一,一对多,多对多的通信。
(6)TCP面向的是 字节流的服务,UDP面向的是 报文的服务。










基于数据挖掘的音乐推荐系统设计与实现 需要一个代码说明,不需要论文 采用python语言,django框架,mysql数据库开 编程环境:pycharm,mysql8.0 系统分为前台+后台模式开 网站前台: 用户注册, 登录 搜索音乐,音乐欣赏(可以在线进行播放) 用户登陆时选择相关感兴趣的音乐风格 音乐收藏 音乐推荐算法:(重点) 本课题需要大量用户行为(如播放记录、收藏列表)、音乐特征(如音频特征、歌曲元数据)等数据 (1)根据用户之间相似性或关联性,给一个用户推荐与其相似或有关联的其他用户所感兴趣的音乐; (2)根据音乐之间的相似性或关联性,给一个用户推荐与其感兴趣的音乐相似或有关联的其他音乐。 基于用户的推荐和基于物品的推荐 其中基于用户的推荐是基于用户的相似度找出相似相似用户,然后向目标用户推荐其相似用户喜欢的东西(和你类似的人也喜欢**东西); 而基于物品的推荐是基于物品的相似度找出相似的物品做推荐(喜欢该音乐的人还喜欢了**音乐); 管理员 管理员信息管理 注册用户管理,审核 音乐爬虫(爬虫方式爬取网站音乐数据) 音乐信息管理(上传歌曲MP3,以便前台播放) 音乐收藏管理 用户 用户资料修改 我的音乐收藏 完整前后端源码,部署后可正常运行! 环境说明 开语言:python后端 python版本:3.7 数据库:mysql 5.7+ 数据库工具:Navicat11+ 开软件:pycharm
MPU6050是一款广泛应用在无人机、机器人和运动设备中的六轴姿态传感器,它集成了三轴陀螺仪和三轴加速度计。这款传感器能够实时监测并提供设备的角速度和线性加速度数据,对于理解物体的动态运动状态至关重要。在Arduino平台上,通过特定的库文件可以方便地与MPU6050进行通信,获取并解析传感器数据。 `MPU6050.cpp`和`MPU6050.h`是Arduino库的关键组成部分。`MPU6050.h`是头文件,含了定义传感器接口和函数声明。它定义了类`MPU6050`,该类含了初始化传感器、读取数据等方法。例如,`begin()`函数用于设置传感器的工作模式和I2C地址,`getAcceleration()`和`getGyroscope()`则分别用于获取加速度和角速度数据。 在Arduino项目中,首先需要含`MPU6050.h`头文件,然后创建`MPU6050`对象,并调用`begin()`函数初始化传感器。之后,可以通过循环调用`getAcceleration()`和`getGyroscope()`来不断更新传感器读数。为了处理这些原始数据,通常还需要进行校准和滤波,以消除噪声和漂移。 I2C通信协议是MPU6050与Arduino交互的基础,它是一种低引脚数的串行通信协议,允许多个设备共享一对数据线。Arduino板上的Wire库提供了I2C通信的底层支持,使得用户无需深入了解通信细节,就能方便地与MPU6050交互。 MPU6050传感器的数据括加速度(X、Y、Z轴)和角速度(同样为X、Y、Z轴)。加速度数据可以用来计算物体的静态位置和动态运动,而角速度数据则能反映物体转动的速度。结合这两个数据,可以进一步计算出物体的姿态(如角度和角速度变化)。 在嵌入式开领域,特别是使用STM32微控制器时,也可以找到类似的库来驱动MPU6050。STM32通常具有更强大的处理能力和更多的GPIO口,可以实现更复杂的控制算法。然而,基本的传感器操作流程和数据处理原理与Arduino平台相似。 在实际应用中,除了基本的传感器读取,还可能涉及到温度补偿、低功耗模式设置、DMP(数字运动处理器)功能的利用等高级特性。DMP可以帮助处理传感器数据,实现更高级的运动估计,减轻主控制器的计算负担。 MPU6050是一个强大的六轴传感器,广泛应用于各种需要实时运动追踪的项目中。通过 Arduino 或 STM32 的库文件,开者可以轻松地与传感器交互,获取并处理数据,实现各种创新应用。博客和其他开源资源是学习和解决问题的重要途径,通过这些资源,开者可以获得关于MPU6050的详细信息和实践指南
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值