tcp四次挥手

TCP三次握手四次挥手

扶醉桌前 提交于 2019-12-01 18:58:48
本文部分资料和示例援引自以下书籍和博客。在此,感谢原作者的创作,以及所有译者的付出,向他们致敬。 1) 《计算机网络第六版》电子工业出版社 2) http://uule.iteye.com/blog/2213562 一、TCP报文格式 上图中有几个字段需要重点介绍下: (1)、源端口、目标端口:计算机上的进程要和其他进程通信是要通过计算机端口的,而一个计算机端口某个时刻只能被一个进程占用,所以通过指定源端口和目标端口,就可以知道是哪两个进程需要通信。源端口、目标端口是用16位表示的,可推算计算机的端口个数为2^16个 (2)、序列号:表示本报文段所发送数据的第一个字节的编号。在TCP连接中所传送的字节流的每一个字节都会按顺序编号。由于序列号由32位表示,所以每2^32个字节,就会出现序列号回绕,再次从0 开始 (3)、确认号:表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。也就是告诉发送发:我希望你(指发送方)下次发送的数据的第一个字节数据的编号是这个确认号 (4)、数据偏移:表示TCP报文段的首部长度,共4位,由于TCP首部包含一个长度可变的选项部分,需要指定这个TCP报文段到底有多长。它指出TCP 报文段的数据起始处距离TCP 报文段的起始处有多远。该字段的单位是32位(即4个字节为计算单位),4位二进制最大表示15,所以数据偏移也就是TCP首部最大60字节 URG

TCP的状态 (SYN, FIN, ACK, PSH, RST, URG)

落花浮王杯 提交于 2019-12-01 18:58:17
一、TCP的状态   在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG。其中,对于我们日常的分析有用的就是前面的五个字段。 它们的含义是: SYN表示建立连接, FIN表示关闭连接, ACK表示响应, PSH表示有 DATA数据传输, RST表示连接重置。   其中,ACK是可能与SYN,FIN等同时使用的,比如SYN和ACK可能同时为1,它表示的就是建立连接之后的响应,如果只是单个的一个SYN,它表示的只是建立连接,TCP的几次握手就是通过这样的ACK表现出来的。但SYN与FIN是不会同时为1的,因为前者表示的是建立连接,而后者表示的是断开连接。RST一般是在FIN之后才会出现为1的情况,表示的是连接重置。   一般地,当出现FIN包或RST包时,我们便认为客户端与服务器端断开了连接;而当出现SYN和SYN+ACK包时,我们认为客户端与服务器建立了一个连接。PSH为1的情况,一般只出现在 DATA内容不为0的包中,也就是说PSH为1表示的是有真正的TCP数据包内容被传递。   TCP的连接建立和连接关闭,都是通过请求-响应的模式完成的。 二、TCP三次握手   TCP(Transmission Control Protocol)传输控制协议,是主机对主机层的传输控制协议,提供可靠的连接服务

TCP三次握手和四次挥手

我只是一个虾纸丫 提交于 2019-12-01 18:54:29
在计算机网络中,TCP的连接的建立和断开过程即三次握手和四次挥手是相当重要的。本人在面试的时候,就经常会被面试官问到这方面的知识,一开始虽然自己心里是知道但表达出来还是磕磕碰碰的,相当坎坷,但这可能会导致面试官会产生一种觉得你对这块的知识并不是很熟悉的“错觉”。所以把基础的知识掌握并明确的表达出来很重要,本人血的教训QAQ。 所以,今天就将TCP的三次握手和四次挥手过程做详细整理,并附上面试过程中常被问到的问题及其答案,以便后续复习和大家参考。 在计算机网络体系结构中,TCP是作用在运输层的一个面向连接的协议。所以TCP运输连接的建立和释放是每一次面向连接的通信中必不可少的过程。 一、TCP连接的建立的释放过程 1、TCP连接的建立(三次握手) TCP建立采用客户服务器方式, 主动发起连接建立的应用进程叫做客户端,被动等待连接的叫做服务器 。TCP连接的的过程叫做握手,握手需要在客户和服务器之间交换三个TCP报文段,其实大家口中流传的三次握手并不是进行了三次握手,而是一次握手过程中交换了三个报文,准确的描述应该是“ 三报文握手 ”即“three way (three message) handshake”。 下图给出了具体过程: 注意: TCP规定,SYN报文段不能携带数据但要消掉一个序号; TCP规定,ACK报文段可以携带数据,但如果不携带数据则不消耗序号

TCP三次握手和四次挥手详解

丶灬走出姿态 提交于 2019-12-01 18:53:49
TCP: SYN ACK FIN RST PSH URG 详解 TCP的三次握手是怎么进行的了:发送端发送一个SYN=1,ACK=0标志的数据包给接收端,请求进行连接,这是第一次握手;接收端收到请求并且允许连接的话,就会发送一个SYN=1,ACK=1标志的数据包给发送端,告诉它,可以通讯了,并且让发送端发送一个确认数据包,这是第二次握手;最后,发送端发送一个SYN=0,ACK=1的数据包给接收端,告诉它连接已被确认,这就是第三次握手。之后,一个TCP连接建立,开始通讯。 SYN:同步标志 同步序列编号(Synchronize Sequence Numbers)栏有效。该标志仅在三次握手建立TCP连接时有效。它提示TCP连接的服务端检查序列编号,该序列编号为TCP连接初始端(一般是客户端)的初始序列编号。在这里,可以把TCP序列编号看作是一个范围从0到4,294,967,295的32位计数器。通过TCP连接交换的数据中每一个字节都经过序列编号。在TCP报头中的序列编号栏包括了TCP分段中第一个字节的序列编号。 ACK:确认标志 确认编号(Acknowledgement Number)栏有效。大多数情况下该标志位是置位的。TCP报头内的确认编号栏内包含的确认编号(w+1,Figure-1)为下一个预期的序列编号,同时提示远端系统已经成功接收所有数据 RST:复位标志 复位标志有效

tcp三次握手四次挥手(及原因)详解

前提是你 提交于 2019-12-01 18:53:02
TCP(Transmission Control Protocol,传输控制协议) 是 面向连接的协议 ,也就是说在收发数据之前,必须先和对方建立连接, 一个TCP连接必须要经过三次“对话”才能建立起来,其中的过程非常复杂,只简单的 描述下这三次对话的简单过程:主机A向主机B发出连接请求数据包:“我想给你发数据,可以吗?”,这是第一次对话;主机B向主机A发送同意连接和要求同步 (同步就是两台主机一个在发送,一个在接收,协调工作)的数据包:“可以,你什么时候发?”,这是第二次对话;主机A再发出一个数据包确认主机B的要求同 步:“我现在就发,你接着吧!”,这是第三次对话。三次“对话”的目的是使数据包的发送和接收同步,经过三次“对话”之后,主机A才向主机B正式发送数 据。 需要了解的信息: ACK : TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1 SYN (SYNchronization) : 在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文。对方若同意建立连接,则应在响应报文中使SYN=1和ACK=1. 因此, SYN置1就表示这是一个连接请求或连接接受报文。 FIN (finis)即完,终结的意思, 用来释放一个连接。当 FIN = 1 时,表明此报文段的发送方的数据已经发送完毕,并要求释放连接。 三次握手的图示:

TCP 3次握手及4次挥手

怎甘沉沦 提交于 2019-12-01 18:52:34
3次握手: TCP协议建立三次握手的过程如下:   第一次握手:客户端向服务器发送SYN段(SYN=1),请求建立新连接   第二次握手:服务器收到SYN段后,向客户端发送的SYNACK段(SYN=1,ACK=1)进行确认,同意建立新连接   第三次握手:客户端收到服务器的SYNACK段后,向服务器发送ACK确认段(ACK=1),并确认连接建立成功;服务器收到ACK确认段后,也确认连接建立成功 原因:  1)为了确保连接建立的双方彼此完全清楚对方状态(如初始序列号和接收窗口大小),从而保证可靠、稳定地建立连接  2)通过三次握手建立连接还可以有效地预防过期、失效的连接请求到达后,导致无效连接的建立  3)两次握手建立连接是不可行的,因为网络存在数据丢失;第二次握手控制段可能丢失,这样主动发起连接的一方由于没有收到第二次握手控制段,则无法建立连接,而接受连接建立的一方则认为连接已经建立,从而出现无效链接 有种情况就是客户端发起了请求,但是过了超时时间又重发的连接请求,而第一个请求并没有丢失,服务端收到syn后,发送了ACK,确认了连接,客户端收到ACK也确认了连接。 这时第二次发送的连接请求阻塞在网络上,但没有丢失,并最终在客户端断开连接后,到达了服务器,此时服务器会理解为新的连接请求,并发送ACK确认连接建立 这一连接并不属于有效连接,属于半连接,但是服务器已经为该连接分配了资源

通俗大白话来理解TCP协议的三次握手和四次分手

谁说胖子不能爱 提交于 2019-12-01 18:52:05
为什么80%的码农都做不了架构师?>>> 通俗大白话来理解TCP协议的三次握手和四次分手 #14 jawil commented on 25 Apr • edited 最近在恶补计算机网络方面的知识,之前对于TCP的三次握手和四次分手也是模模糊糊,对于其中的细节更是浑然不知,最近看了很多这方面的知识,也在系统的学习计算机网络,加深自己的CS功底,就把看过的一些比较好的东西和自己的一些理解二次加工组织一下然后交流分享,一起学习进步,对了这个面试好像经常问到。 原文收录在我的 GitHub博客 ( https://github.com/jawil/blog ) ,喜欢的可以关注最新动态,大家一起多交流学习,共同进步,以学习者的身份写博客,记录点滴。 通俗理解: 但是为什么一定要进行三次握手来保证连接是双工的呢,一次不行么?两次不行么?我们举一个现实生活中两个人进行语言沟通的例子来模拟三次握手。 引用网上的一些通俗易懂的例子,虽然不太正确,后面会指出,但是不妨碍我们理解,大体就是这么个理解法。 第一次对话: 老婆让甲出去打酱油,半路碰到一个朋友乙,甲问了一句:哥们你吃饭了么? 结果乙带着耳机听歌呢,根本没听到,没反应。甲心里想:跟你说话也没个音,不跟你说了,沟通失败。说明乙接受不到甲传过来的信息的情况下沟通肯定是失败的。 如果乙听到了甲说的话,那么第一次对话成功,接下来进行第二次对话。

TCP三次握手与四次挥手过程

六月ゝ 毕业季﹏ 提交于 2019-12-01 18:51:32
首先,客户端与服务器均处于未连接状态,并且是客户端主动向服务器请求建立连接: 客户端将报文段中的SYN=1,并选择一个seq=x,(即该请求报文的序号为x) 将这个报文发送到服务器。此时,客户端进入同步已发送状态(SYN-SEND).SYN报文段不能携带数据,但是要消耗掉一个序号。 服务器收到请求报文后,若同意建立连接,则回复报文中,SYN=1,ACK=1,并选择一个seq = y,且报文中确认号为x+1,序号为y .此时服务器进入同步已接收状态(SYN-RCVD) 客户端收到服务器的同步确认后,对服务器发送确认的确认。将ACK=1,确认号为y+1,而报文首部的序号为x+1,将该报文发出后,客户端进入已连接状态(ESTABLISHED)。 服务器收到客户端的确认后,也进入已连接状态。 以上即三次握手 为何使用三次握手机制: 假设如下异常情况: 客户端向服务器发送了第一条请求报文,但是该报文并未在网络中被丢弃,而是长时间阻滞在某处,而客户端收不到服务器确认,以为该报文丢失,于是重新发送该报文,这次的报文成功到达服务器,如果不使用三次握手,则服务器只需对该报文发出确认,就建立了一个连接。而在这个连接建立,并释放后,第一次发送的,阻滞在网络中的报文到达了服务器,服务器以为是客户端又重新发送了一个连接请求(实际上在客户端那里,该连接早已失效),就又向客户端发送一个确认

TCP的RST报文

核能气质少年 提交于 2019-12-01 18:48:48
我们知道TCP建立连接的时候需要三次连接,TCP释放连接的时候需要四次挥手,在这个过程中,出现了很多特殊的标志报文段,例如SYN ACK FIN,在TCP协议中,除了上面说了那些标志报文段之外,还有其他的报文段,如PUSH标志报文段以及今天需要重点讲解的RST报文段。 RST:(Reset the connection) 用于复位因某种原因引起出现的错误连接,也用来拒绝非法数据和请求 。如果接收到RST位时候,通常发生了某些错误; 发送RST包关闭连接时,不必等缓冲区的包都发出去,直接就丢弃缓冲区中的包,发送RST;接收端收到RST包后,也不必发送ACK包来确认。 “Connection reset”的原因是服务器关闭了Connection[调用了Socket.close()方法]。大家可能有疑问了:服务器关闭了Connection为什么会返回“RST”而不是返回“FIN”标志。原因在于Socket.close()方法的语义和TCP的“FIN”标志语义不一样:发送TCP的“FIN”标志表示我不再发送数据了,而Socket.close()表示我不在发送也不接受数据了。问题就出在“我不接受数据” 上,如果此时客户端还往服务器发送数据,服务器内核接收到数据,但是发现此时Socket已经close了,则会返回“RST”标志给客户端。当然,此时客户端就会提示:“Connection

TCP三次握手四次挥手总结(流程、常见问题、会发生的攻击、防范方法)

我们两清 提交于 2019-12-01 18:48:35
三次握手 我们先明确两个定义: 1,client为数据发送方 2,server为数据接收方 好,下面进行三次握手的总结: 1,client想要向server发送数据,请求连接。这时client想服务器发送一个数据包,其中 同步位(SYN) 被置为1,表明client申请TCP连接,序号为j。 2,当server接收到了来自client的数据包时,解析发现同步位为1,便知道client是想要简历TCP连接,于是将当前client的IP、端口之类的加入未连接队列中,并向client回复接受连接请求,想client发送数据包,其中 同步位为1,并附带确认位ACK=j+1 ,表明server已经准备好分配资源了,并向client发起连接请求,请求client为建立TCP连接而分配资源。 3,client向server回复一个ACK,并分配资源建立连接。server收到这个确认时也分配资源进行连接的建立 那么问题来了 为什么需要第三次握手? 第三次握手失败了怎么办? 三次握手有什么缺陷可以被黑客利用,用来对服务器进行攻击? 怎么防范这种攻击? 接下来进行一一解答。 1,为什么需要第三次握手? 答:如果没有第三次握手,可能会出现如下情况: 如果只有两次握手,那么server收到了client的 SYN=1的请求连接数据包 之后,便会分配资源并且向client发送一个 确认位ACK回复数据包 。