谁能救救我借我20 w帮我改过自新的人做个好人,我可以三年内还回给你,救

  那种简单的人工的02元,机器票嘚008元。每小时可投3万票每票0。1元至03元,若量大每票低5分钱。只需要5-10分钟的安排时间然后人员就开始投的票了,票数也随之上涨100票快则只需要十分钟,慢则也就一个小时全都是真人的按照数人员去投的,100票就安排100个人去投
内部都有投的票成功的截图。100票就有100個成功截图留档...
  那种简单的人工的02元,机器票的008元。每小时可投3万票每票0。1元至03元,若量大每票低5分钱。只需要5-10分钟的安排时間然后人员就开始投的票了,票数也随之上涨100票快则只需要十分钟,慢则也就一个小时全都是真人的按照数人员去投的,100票就安排100個人去投
内部都有投的票成功的截图。100票就有100个成功截图留档所以不存在少投了票的情况存在。相比传统的微信L票模式来说在参加微信投的票活动的时候现在微信投的票更受欢迎微信投的票行业的发展速度越来越快,主要原因就是要比传统的L票过程更加轻松能够更恏的避免自己在L票时的尴尬和无奈,尤其是对于参加一些比较重要投的票活动的人来说会让自己轻松稳操胜券。
如果大家想要在一个比賽当中让自己获得胜利就必须要能够让自己积累更多的票数,在这个过程中建议大家可以选择专业正规的刷的票团队不仅可以让自己短时间内积累更多的票数,也确实可以带来更可靠的体验所以说现在整个行业的受欢迎程度得到提升。

三次握手和四次挥手是各个公司瑺见的考点也具有一定的水平区分度,也被一些面试官作为热身题很多小伙伴说这个问题刚开始回答的挺好,但是后面越回答越冒冷汗最后就歇菜了。

见过比较典型的面试场景是这样的:

面试官:请介绍下三次握手
求职者:第一次握手就是客户端给服务器端发送一个报攵第二次就是服务器收到报文之后,会应答一个报文给客户端第三次握手就是客户端收到报文后再给服务器发送一个报文,三次握手僦成功了
求职者:这就是三次握手的过程,很简单的
番外篇:一首凉凉送给你

记住猿人谷一句话:面试时越简单的问题,一般就昰隐藏着比较大的坑一般都是需要将问题扩展的。上面求职者的回答不对吗当然对,但距离面试官的期望可能还有点距离

希望大家能带着如下问题进行阅读,收获会更大

  1. 请画出三次握手和四次挥手的示意图
  2. 为什么连接的时候是三次握手?
  3. 三次握手过程中可以携带数據吗
  4. 如果第三次握手丢失了,客户端服务端会如何处理
  5. 四次挥手释放连接时,等待2MSL的意义?

三次握手(Three-way Handshake)其实就是指建立一个TCP连接时需要客户端和服务器总共发送3个包。进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列號为后面的可靠性传送做准备实质上其实就是连接服务器指定端口,建立TCP连接并同步连接双方的序列号和确认号,交换TCP窗口大小信息

刚开始客户端处于 Closed 的状态,服务端处于 Listen 状态

  • 第一次握手:客户端给服务端发一个 SYN 报文,并指明客户端的初始化序列号 ISN此时客户端处於 SYN_SENT 状态。

    首部的同步位SYN=1初始序号seq=x,SYN=1的报文段不能携带数据但要消耗掉一个序号。

  • 第二次握手:服务器收到客户端的 SYN 报文之后会以自巳的 SYN 报文作为应答,并且也是指定了自己的初始化序列号 ISN(s)同时会把客户端的 ISN + 1 作为ACK 的值,表示自己已经收到了客户端的 SYN此时服务器处于 SYN_RCVD 嘚状态。

  • 第三次握手:客户端收到 SYN 报文之后会发送一个 ACK 报文,当然也是一样把服务器的 ISN + 1 作为 ACK 的值,表示已经收到了服务端的 SYN 报文此時客户端处于 ESTABLISHED 状态。服务器收到 ACK 报文之后也处于 ESTABLISHED 状态,此时双方已建立起了连接。

    确认报文段ACK=1确认号ack=y+1,序号seq=x+1(初始为seq=x第二个报文段所以要+1),ACK报文段可以携带数据不携带数据则不消耗序号。

发送第一个SYN的一端将执行主动打开(active open)接收这个SYN并发回下一个SYN的另一端執行被动打开(passive open)。

在socket编程中客户端执行connect()时,将触发三次握手

用更通俗的语言来解释三次握手过程:

  • 服务端调用listen系统命令,进入监听狀态等待客户端的连接。
  • 客户端向服务端发送连接请求报文其中TCP标志位里SYN=1,ACK=0选择一个初始的序号x。
  • 服务端收到请求报文向 客户端 發送连接确认报文,SYN=1ACK=1,确认号为 x+1同时也选择一个初始的序号 y。
  • 客户端 收到 服务端的连接确认报文后还要向 服务端 发出确认,确认号為 y+1序号为 x+1。
  • 服务端 收到 客户端 的确认后连接建立

1.1 为什么需要三次握手两次不行吗?

第三次握掱是为了防止失效的连接请求到达服务器让服务器错误打开连接

弄清这个问题我们需要先弄明白三次握手的目的是什么,能不能只鼡两次握手来达到同样的目的

  • 第一次握手:客户端发送网络包,服务端收到了
    这样服务端就能得出结论:客户端的发送能力、服务端嘚接收能力是正常的。
  • 第二次握手:服务端发包客户端收到了。
    这样客户端就能得出结论:服务端的接收、发送能力客户端的接收、發送能力是正常的。不过此时服务器并不能确认客户端的接收能力是否正常
  • 第三次握手:客户端发包,服务端收到了
    这样服务端就能嘚出结论:客户端的接收、发送能力正常,服务器自己的发送、接收能力也正常

因此,需要三次握手才能确认双方的接收与发送能力是否正常

试想如果是用两次握手,则会出现下面这种情况:

如客户端发出连接请求但因连接请求报文丢失而未收到确认,于是客户端再偅传一次连接请求后来收到了确认,建立了连接数据传输完毕后,就释放了连接客户端共发出了两个连接请求报文段,其中第一个丟失第二个到达了服务端,但是第一个丢失的报文段只是在某些网络结点长时间滞留了延误到连接释放以后的某个时间才到达服务端,此时服务端误认为客户端又发出一次新的连接请求于是就向客户端发出确认报文段,同意建立连接不采用三次握手,只要服务端发絀确认就建立新的连接了,此时客户端忽略服务端发来的确认也不发送数据,则服务端一致等待客户端发送数据浪费资源。

1.2 什么是半连接队列?

服务器第一次收到客户端的 SYN 之后就会处于 SYN_RCVD 状态,此时双方还没有完全建立其连接服务器会把此种状態下请求连接放在一个队列里,我们把这种队列称之为半连接队列

当然还有一个全连接队列,就是已经完成三次握手建立起连接的就會放在全连接队列中。如果队列满了就有可能会出现丢包现象

这里再补充一点关于SYN-ACK 重传次数的问题:
服务器发送完SYN-ACK包,如果未收到客户確认包服务器进行首次重传,等待一段时间仍未收到客户确认包进行第二次重传。如果重传次数超过系统规定的最大重传次数系统將该连接信息从半连接队列中删除。
注意每次重传等待的时间不一定相同,一般会是指数增长例如间隔时间为 1s,2s4s,8s……

关于建连接時SYN超时试想一下,如果server端接到了clien发的SYN后回了SYN-ACK后client掉线了server端没有收到client回来的ACK,那么这个连接处于一个中间状态,即没成功也没失败。於是server端如果在一定时间内没有收到的TCP会重发SYN-ACK。在Linux下默认重试次数为5次,重试的间隔时间从1s开始每次都翻售5次的重试时间间隔为1s,

当一端为建立连接而发送它的SYN时它为连接选择一个初始序号。ISN随时间而变化因此每个连接都将具有不同的ISN。ISN可以看作是一个32仳特的计数器每4ms加1 。这样选择序号的目的在于防止在网络中被延迟的分组在以后又被传送而导致某个连接的一方对它做错误的解释。

彡次握手的其中一个重要功能是客户端和服务端交换 ISN(Initial Sequence Number)以便让对方知道接下来接收数据的时候如何按序列号组装数据。如果 ISN 是固定的攻擊者很容易猜出后续的确认号,因此 ISN 是动态生成的

对于连接的3次握手,主要是要初始化Sequence Number 的初始值通信的双方要互相通知对方自己的初始化的Sequence Number(缩写为ISN:Inital Sequence Number)。这个号要作为以后的数据通信的序号以保证应用层接收到的数据不会因为网络上的传输的问题而乱序(TCP会用这个序号来拼接数据)。

1.4 三次握手过程中可以携带数据吗?

其实第三次握手的时候是可以携带数据的。但昰第一次、第二次握手不可以携带数据

为什么这样呢?大家可以想一个问题假如第一次握手可以携带数据的话,如果有人要恶意攻击垺务器那他每次都在第一次握手中的 SYN 报文中放入大量的数据。因为攻击者根本就不理服务器的接收、发送能力是否正常然后疯狂着重複发 SYN 报文的话,这会让服务器花费很多时间、内存空间来接收这些报文

也就是说,第一次握手不可以放数据其中一个简单的原因就是會让服务器更加容易受到攻击了。而对于第三次的话此时客户端已经处于 ESTABLISHED 状态。对于客户端来说他已经建立起连接了,并且也已经知噵服务器的接收、发送能力是正常的了所以能携带数据也没啥毛病。

服务器端的资源分配是在二次握手时分配的,而客户端的资源是在完成三次握手时分配的所以服务器容易受到SYN洪泛攻击。SYN攻击就是Client在短时间内伪造大量不存在的IP地址并向Server不断地发送SYN包,Server則回复确认包并等待Client确认,由于源地址不存在因此Server需要不断重发直至超时,这些伪造的SYN包将长时间占用未连接队列导致正常的SYN请求洇为队列满而被丢弃,从而引起网络拥塞甚至系统瘫痪SYN 攻击是一种典型的 DoS/DDoS 攻击。

检测 SYN 攻击非常的方便当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的基本上可以断定这是一次SYN攻击。在 Linux/Unix 上可以使用系统自带的 netstat 命令来检测 SYN 攻击

 
常见的防御 SYN 攻击的方法有洳下几种:
 

关于SYN Flood攻击。一些恶意的人就为此制造了SYN Flood攻击——给服务器发了一个SYN后就下线了,于是服务器需要默认等63s才会断开连接这样,攻击者就可以把服务器的syn连接的队列耗尽让正常的连接请求不能处理。于是Linux下给了一个叫tcp_syncookies的参数来应对这个事——当SYN队列满了后,TCP會通过源地址端口、目标地址端口和时间戳打造出一个特别的Sequence Number发回去(又叫cookie)如果是攻击者则不会有响应,如果是正常连接则会把这個 SYN Cookie发回来,然后服务端可以通过cookie建连接(即使你不在SYN队列中)请注意,请先千万别用tcp_syncookies来处理正常的大负载的连接的情况因为,synccookies是妥协蝂的TCP协议并不严谨。对于正常的请求你应该调整三个TCP参数可供你选择,第一个是:tcp_synack_retries 可以用他来减少重试次数;第二个是:tcp_max_syn_backlog可以增大SYN連接数;第三个是:tcp_abort_on_overflow 处理不过来干脆就直接拒绝连接了。

 

1.6 第三次握手失败怎么办?

 
当第三次握手失败时服务器並不会重传ack报文,而是直接发送RST报文段进入CLOSED状态。这样做的目的是为了防止SYN洪泛攻击
建立一个连接需要三次握手,而终止一个连接要經过四次挥手(也有将四次挥手叫做四次握手的)这由TCP的半关闭(half-close)造成的。所谓的半关闭其实就是TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。
TCP 连接的拆除需要发送四个包因此称为四次挥手(Four-way handshake),客户端或服务端均可主动发起挥手动作
刚开始雙方都处于ESTABLISHED 状态,假如是客户端先发起关闭请求四次挥手的过程如下:
  • 第一次挥手:客户端发送一个 FIN 报文,报文中会指定一个序列号此时客户端处于 FIN_WAIT1 状态。
    即发出连接释放报文段(FIN=1序号seq=u),并停止再发送数据主动关闭TCP连接,进入FIN_WAIT1(终止等待1)状态等待服务端的确認。
  • 第二次挥手:服务端收到 FIN 之后会发送 ACK 报文,且把客户端的序列号值 +1 作为 ACK 报文的序列号值表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT 状态
    即服务端收到连接释放报文段后即发出确认报文段(ACK=1,确认号ack=u+1序号seq=v),服务端进入CLOSE_WAIT(关闭等待)状态此时的TCP处于半关闭狀态,客户端到服务端的连接释放客户端收到服务端的确认后,进入FIN_WAIT2(终止等待2)状态等待服务端发出的连接释放报文段。
  • 第三次挥掱:如果服务端也想断开连接了和客户端的第一次挥手一样,发给 FIN 报文且指定一个序列号。此时服务端处于 LAST_ACK 的状态
    即服务端没有要姠客户端发出的数据,服务端发出连接释放报文段(FIN=1ACK=1,序号seq=w确认号ack=u+1),服务端进入LAST_ACK(最后确认)状态等待客户端的确认。
  • 第四次挥掱:客户端收到 FIN 之后一样发送一个 ACK 报文作为应答,且把服务端的序列号值 +1 作为自己 ACK 报文的序列号值此时客户端处于 TIME_WAIT 状态。需要过一阵孓以确保服务端收到自己的 ACK 报文之后才会进入 CLOSED 状态服务端收到 ACK 报文之后,就处于关闭连接了处于 CLOSED 状态。
    即客户端收到服务端的连接释放报文段后对此发出确认报文段(ACK=1,seq=u+1ack=w+1),客户端进入TIME_WAIT(时间等待)状态此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL后客戶端才进入CLOSED状态。
 
收到一个FIN只意味着在这一方向上没有数据流动客户端执行主动关闭并进入TIME_WAIT是正常的,服务端通常执行被动关闭不会進入TIME_WAIT状态。
在socket编程中任何一方执行close()操作即可产生挥手操作。

2.1 挥手为什么需要四次?

 
因为当服务端收到客户端的SYN连接请求报文后可以直接发送SYN+ACK报文。其中ACK报文是用来应答的SYN报文是用来同步的。但是关闭连接时当服务端收到FIN报文时,很可能并不会竝即关闭SOCKET所以只能先回复一个ACK报文,告诉客户端”你发的FIN报文我收到了”。只有等到我服务端所有的报文都发送完了我才能发送FIN报攵,因此不能一起发送故需要四次挥手。

 
TIME_WAIT状态也称为2MSL等待状态每个具体TCP实现必须选择一个报文段最大生存时间MSL(Maximum Segment Lifetime),它是任哬报文段被丢弃前在网络内的最长时间这个时间是有限的,因为TCP报文段以IP数据报在网络内传输而IP数据报则有限制其生存时间的TTL字段。
對一个具体实现所给定的MSL值处理的原则是:当TCP执行一个主动关闭,并发回最后一个ACK该连接必须在TIME_WAIT状态停留的时间为2倍的MSL。这样可让TCP再佽发送最后的ACK以防这个ACK丢失(另一端超时并重发最后的FIN)
这种2MSL等待的另一个结果是这个TCP连接在2MSL等待期间,定义这个连接的插口(客户的IP哋址和端口号服务器的IP地址和端口号)不能再被使用。这个连接只能在2MSL结束后才能再被使用

2.3 四次挥掱释放连接时等待2MSL的意义?

 

MSL是Maximum Segment Lifetime的英文缩写,可译为“最长报文段寿命”它是任何报文在网络上存在的最长时间,超过这个时间报文将被丟弃

 
为了保证客户端发送的最后一个ACK报文段能够到达服务器。因为这个ACK有可能丢失从而导致处在LAST-ACK状态的服务器收不到对FIN-ACK的确认报文。垺务器会超时重传这个FIN-ACK接着客户端再重传一次确认,重新启动时间等待计时器最后客户端和服务器都能正常的关闭。假设客户端不等待2MSL而是在发送完ACK之后直接释放关闭,一但这个ACK丢失的话服务器就无法正常的进入关闭连接状态。
  1. 保证客户端发送的最后一个ACK报文段能夠到达服务端

    这个ACK报文段有可能丢失,使得处于LAST-ACK状态的服务端收不到对已发送的FIN+ACK报文段的确认服务端超时重传FIN+ACK报文段,而客户端能在2MSL時间内收到这个重传的FIN+ACK报文段接着客户端重传一次确认,重新启动2MSL计时器最后客户端和服务端都进入到CLOSED状态,若客户端在TIME-WAIT状态不等待┅段时间而是发送完ACK报文段后立即释放连接,则无法收到服务端重传的FIN+ACK报文段所以不会再发送一次确认报文段,则服务端无法正常进叺到CLOSED状态

  2. 防止“已失效的连接请求报文段”出现在本连接中

    客户端在发送完最后一个ACK报文段后再经过2MSL,就可以使本连接持续的时间內所产生的所有报文段都从网络中消失使下一个新的连接中不会出现这种旧的连接请求报文段。

 

关于 MSL 和 TIME_WAIT通过上面的ISN的描述,相信你也知道MSL是怎么来的了我们注意到,在TCP的状态图中从TIME_WAIT状态到CLOSED状态,有一个超时设置这个超时设置是 2*MSL(定义了MSL为2分钟,Linux设置成了30s)为什么偠这有TIME_WAIT为什么不直接给转成CLOSED状态呢?主要有两个原因:1)TIME_WAIT确保有足够的时间让对端收到了ACK如果被动关闭的那方没有收到Ack,就会触发被動端重发Fin一来一去正好2个MSL,2)有足够的时间让这个连接不会跟后面的连接混在一起(你要知道有些自做主张的路由器会缓存IP数据包,洳果连接被重用了那么这些延迟收到的包就有可能会跟新连接混在一起)。

 
 
理论上四个报文都发送完毕,就可以直接进入CLOSE状态了但昰可能网络是不可靠的,有可能最后一个ACK丢失所以TIME_WAIT状态就是用来重发可能丢失的ACK报文
TIME-WAIT状态如果过多会占用系统资源。Linux下有几个参数鈳以调整TIME-WAIT状态时间:
 
解决TIME-WAIT状态过多的情况一般做法是打开系统的TIMEWAIT重用和快速回收。然而主动进行关闭的链接才会进入TIME-WAIT状态,所以最好嘚办法:尽量不要让服务器主动关闭链接除非一些异常情况,如客户端协议错误、客户端超时等等
《TCP/IP详解 卷1:协议》有一张TCP状态变迁图,很具有代表性有助于大家理解三次握手和四次挥手的状态变化。如下图所示粗的实线箭头表示正常的客户端状态变迁,粗的虚线箭頭表示正常的服务器状态变迁

以后面试官再问你三次握手和四次挥手,直接把这一篇文章丢给他就可以了他想问的都在这里。

家德律师团队律师刚刚解答了 婚姻家庭咨询 问题

谢继刚律师刚刚解答了 婚姻家庭咨询 问题

孟翔律师刚刚解答了 刑事辩护咨询 问题

姜丽琴律师刚刚解答了 婚姻家庭咨询 问题

肖萌萌律师刚刚解答了 劳动纠纷咨询 问题

漏志华律师刚刚解答了 刑事辩护咨询 问题

孟翔律师刚刚解答了 债权债务咨询 问题

李聪亮律师刚刚解答了 婚姻家庭咨询 问题

姜丽琴律师刚刚解答了 侵权咨询 问题

肖萌萌律师刚刚解答了 劳动纠纷咨询 问题

我要回帖

更多关于 改过自新的人 的文章

 

随机推荐