三次握手和四次挥手的理解

在这里插入图片描述

1.源端口和目的端口,各占两个字节,分别写入源端口和目的端口;
2.序号seq,占4个字节,TCP连接中传送的字节流中的每个字节 都按顺序编号,例如,一段报文的序号字段值是101,携带的数据共有100字段,则下一段报文(如果存在下一个报文)的数据序号就应该从201开始;
3.确认号ack,占4个字节,是期望收到对方下一个报文的第一个数据字节的序号。例如B收到了A发送过来的报文,其序列号是201,而数据长度是300字节,这表明B正确收到了A发送的到序号500为止的数据。所以,B希望收到A的下一个数据序号是501,于是B在向A发送的确认报文中把确认号置为501;
4.数据偏移,占4位,它指出TCP报文的数据距离TCP报文段的起始位置有多远;
5.保留,占6位,保留今后使用,目前应该都为0;
6.紧急URG,URG=1时,证明紧急指针字段有效,告诉系统此报文段中有紧急数据;
7.确认ACK,仅当ACK=1时,确认号字段才有效,TCP规定,在连接建立后所有报文的传输都必须把ACK置为1;
8.推送PSH,当两个应用进程进行交互式通行时,一端的应用进程希望在键入一个命令后能够立即得到对方的响应,这是就置PSH=1;
9.重置(复位)RST,RST=1,表明TCP连接中出现严重差错,必须释放连接,然后再重新连接;
10.同步SYN,在建立连接时用于同步信号。当SYN=1,ACK=0时表明是连接请求报文,若同意连接,则响应报文中会使SYN=1,ACK=1;
11.终止FIN,用于释放连接。当FIN=1时,表明此报文的发送方的数据已经发送完毕,并且要求释放连接;
12.窗口,占2字节,指的是通知接收方,发送本报文你需要有多大的空间来接受;
13.校验和,占2字节,检验首部和数据这两部分;
14.紧急指针,占2字节,指出本报文段的紧急数据的字节数;
15.选项,长度可变,定义一些其他的可选参数。

三次握手
在这里插入图片描述

1.第一次握手:客户A发送位码SYN=1,随机产生seq=x 的数据包到服务器B,服务器B有SYN=1知道客户A要求建立联机,此时客户A进入SYN_SENT状态,等待服务器B确认;
2.第二次握手:服务器B收到确认请求后要确认联机信息,向客户A发送ack=x+1(即seq+1),seq=y,ACK=1,SYN=1,此时服务器B相当于为客户A做确认的同时发送了一个自己的seq需要客户A做确认,服务器B进入SYN_RECV状态;
3.第三次握手:客户A收到后检查ack是否正确(即自己发送的seq+1)并确认ACK=1,若正确,客户A再想服务器B发送ACK=1,seq=x+1,ack=y+1,服务器B收到后确认seq(是否等于自己发送的ack)ack(是否是自己发送的
seq+1)并且ACK=1则连接建立成功。此时服务器进入ESTABLISHED状态,意味着 可以开始数据传输了。

三次握手的原因是为了让客户端和服务端都确定双方发送、接收功能正常
第一次握手:客户端发送网络包,服务端收到了。 这样服务端就能得出结论:客户端的发送能力、服务端的接收能力是正常的。
第二次握手:服务端发包,客户端收到了。 这样客户端就能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。不过此时服务器并不能确认客户端的接收能力是否正常。
第三次握手:客户端发包,服务端收到了。 这样服务端就能得出结论:客户端的接收、发送能力正常,服务器自己的发送、接收能力也正常。

四次挥手
在这里插入图片描述

1.客户机主动请求关闭连接,向服务器发送一个FIN=1(用来关闭客户机到服务器的数据传送),seq=u(随机序列号),客户机进入FIN_WAIT1状态;
2.服务器收到该报文后回应一个报文,ACK=1,ack=u+1,seq=v,服务器进入CLOSE_WAIT状态,客户机收到服务器回复后进入FIN_WAIT2状态;
3.服务器查看自身是否有未发送或者待发送的数据,若无,服务器被动关闭连接,向客户机发送FIN报文,FIN=1,ACK=1,seq=w,ack=u+1。若有待传输的数据,执行完后再发送FIN报文;
4.客户机收到服务器的FIN报文后,随机发送ACK报文确认,ACK=1,ack=w+1,客户机进入TIME_WAIT状态(用于可靠地终止TCP连接,保证让迟来的TCP报文段有足够短的时间被
识别并丢弃),待两个MSL(报文最大生存时间,保证本次连接的所有数据从网络中消失,避免出现粘包现像)后进入CLOSED状态,服务器收到ACK=1后进入CLOSED状态。

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

TIME_WAIT也叫2MSL
MSL是 Maximum Segment Lifetime 的英文缩写,可译为“最长报文段寿命”,它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃
最后客户端等待2MSL的理由
1、保证客户端发送的最后一个 ACK 报文段能够到达服务端
2、防止“已失效的连接请求报文段”出现在本连接中
假设发起主动关闭的一方(client)最后发送的ACK在网络中丢失,由于TCP协议的重传机制,执行被动关闭的一方(server)将会重发其FIN,那么client方为了保证server已经close,就会等待(client发送ACK的时间超时了=1MSL)+(server重新发送FIN=1MSL),如果server关闭了,那么2MSL内将不会发送FIN,则client可以安全关闭

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值