打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
TCP三次握手与四次挥手

今天我们来讲讲三次握手与四次挥手的过程,本文仅代表自己的理解,若是有不对的地方,欢迎指点。
目录:
1.TCP三次握手
2.TCP四次挥手
3.TCP报文格式(传输层)
4.IP数据包格式(网络层)
5.SYN攻击


首先,我们来举例说明这两个过程。
三次握手:
A:我们在一起吧;
B:那好吧,我答应你,我愿意和你在一起;
A:好的,那我们就在一起了,要保持联系;
四次挥手:
A:我们分手吧;
B:真的吗?给我点时间让我考虑考虑吧;(此时A接收到消息后,处于等待的状态);
B:我考虑好了,我们分手吧;
A:我有点怀疑,你尽然那么爽快的就答应了,我还是再向你确认下,我们彻底分手了,不要再联系了;

进入正题:
1.TCP三次握手:
所谓三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。
详细过程:
(1)第一次握手:Client将标志位SYN=1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
(2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
(3)第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
总结:
第一次:Client---->Server(发送SYN)
第二次:Server----->Client(发送ACK+SYN)
第三次:Client---->Server(发送SYN)
例如下图:用wireshark抓包得到的结果
 
 
 
 

2.四次挥手:
(1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
(2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
(3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
(4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
总结:
第一次:Client---->Server(发送FIN)
第二次:Server----->Client(发送ACK)
次:Server----->Client(发送FIN)
第四次:Client---->Server(发送ACK)
如下图:
 
 

注意:在TIME_WAIT状态中,如果TCP client端最后一次发送的ACK丢失了,它将重新发送。TIME_WAIT状态中所需要的时间是依赖于实现方法的。典型的值为30秒、1分钟和2分钟。等待之后连接正式关闭,并且所有的资源(包括端口号)都被释放。

【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

【问题2】为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。


3.TCP报文格式(传输层): 
 由上图可以看到TCP标志位(位码)有6种:
URG(urgent紧急)
ACK(acknowledgement 确认) 
PSH(push传送)
RST(reset重置)  
SYN(synchronous建立联机) 
FIN(finish结束) 

具体含义如下:
URG:为 1 表示紧急指针有效,为 0 则忽略紧急指针值

ACK:为 1 表示确认号有效,为 0 表示报文中不包含确认信息,忽略确认号字段

PSH:为 1 表示是带有 PUSH 标志的数据,指示接收方应该尽快将这个报文段交给应用层而不用等待缓冲区装满

RST:用于复位由于主机崩溃或其他原因而出现错误的连接。它还可以用于拒绝非法的报文段和拒绝连接请求。一般情况下,如果收到一个 RST 为 1 的报文,那么一定发生了某些问题

SYN:同步序号,为 1 表示连接请求,用于建立连接和使顺序号同步( synchronize )

FIN:用于释放连接,为 1 表示发送方已经没有数据发送了,即关闭本方数据流


 需要注意的是:
  (A)不要将确认序号ack标志位中的ACK搞混了。
  (B)确认方ack=发起方Req+1,两端配对。 

 
Source Port(16位):源端口号
Destination Port(16位):目标端口号
Sequence number(32位):顺序号,4个字节,用来标识从 TCP 源端向 TCP 目的端发送的数据字节流,它表示在这个报文段中的第一个数据字节的顺序号。如果将字节流看作在两个应用程序间的单向流动,则 TCP 用顺序号对每个字节进行计数。序号是 32bit 的无符号数,序号到达 (2^32) - 1 后又从 0 开始。当建立一个新的连接时, SYN 标志变 1 ,顺序号字段包含由这个主机选择的该连接的初始顺序号 ISN ( Initial Sequence Number );
Acknowledgment number(32位):确认号,4个字节,包含发送确认的一端所期望收到的下一个顺序号。因此,确认序号应当是上次已成功收到数据字节顺序号加 1 。只有 ACK 标志为 1 时确认序号字段才有效,Ack=Seq+1;
Flage:标志位,看上面的解析;

Window Size:窗口大小,2个字节,表示从确认号开始,本报文的源方可以接收的字节数,即源方接收窗口大小。窗口大小是一个 16bit 字段,因而窗口大小最大为 65535(2^16 - 1)

Checksum:校验和,2个字节,对整个的 TCP 报文段(包括 TCP 头部和 TCP 数据),以 16 位字进行计算所得。这是一个强制性的字段,要求由发送端计算和存储,并由接收端进行验证

Urgent Pointer:紧急指针,2个字节,是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号。 TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式。 只有当URG 标志置 1 时紧急指针才有效

Option and Pad:选项和填充,n*4字节,常见的可选字段是最长报文大小 MSS(Maximum Segment Size) 。每个连接方通常都在通信的第一个报文段(为建立连接而设置 SYN 标志的那个段)中指明这个选项,它指明本端所能接收的最大长度的报文段。选项长度不一定是 32 位字的整数倍,所以要加填充位,使得报头长度成为整字数

Data:数据,不定长度,为上层协议封装好的数据



4.IP数据包格式(网络层): 
 对应的数据如下图:
 
版本:IP协议版本号,长度为4位,IPv4此字段值为4,IPv6此字段值为6;
首部长度:以32位的字为单位,该字段长度为4位,最小值为5,即不带任何选项的IP首部20个字节;最大值为15,所以首部长度最大为60个字节;
服务类型(TOS)长度为8位。此字段包含3位的优先权(现已忽略),4位的服务类型子字段(只能有一位置1)和1位的保留位(必须置0)。4位的服务类型分别为最小延迟(D)、最大吞吐量(T)、最高可靠性(R)、最小费用(F);
总长度:该字段长度为16位,以字节为单位,该字段长度包含IP的头部和数据部分(payload)。IP数据报最大可达65535个字节;
标识:16位标识,用来标识一个IP数据报,每发送一个此值会加1,可用于分片和重新组装成数据报;
标志与片偏移:3位标志其中第一位不使用, 每二位DF(Don’t Fragment),该位如果为1,如果传输的数据报超过最大传输单元,该数据报会被丢弃,并发送一个ICMP差错报文。第三位MF(More Fragment)表示是否有更多的片,该位为1,说明后续有分片。最后一片MF为0。
TTL(Time To Live):表示数据报最多可经过的路由器的数量。数据报每经过一个路由器,TTL减1,减为0时丢弃,并发送ICMP报文通知源主机。TTL可以避免数据报在路由器之间不断循环;
协议类型:表示IP层上承载的是哪个高级协议。在封装与分用的过程中,协议栈知道该交给哪个层的协议处理;1 ICMP 2 IGMP 6 TCP 17UDP;
头部校验和:保证数据报头部的数据完整性,但校验不包括数据部分
源IP地址:发送数据的主机IP地址
目的IP地址:接收数据的主机IP地址

5.SYN攻击

   在三次握手过程中,服务器发送SYN-ACK之后,收到客户端的ACK之前的TCP连接称为半连接(half-open connect).此时服务器处于Syn_RECV状态.当收到ACK后,服务器转入ESTABLISHED状态.

  Syn攻击就是 攻击客户端 在短时间内伪造大量不存在的IP地址,向服务器不断地发送syn包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直 至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。

 Syn攻击是一个典型的DDOS攻击。检测SYN攻击非常的方便,当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击.在Linux下可以如下命令检测是否被Syn攻击

netstat -n -p TCP | grep SYN_RECV

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

但是不能完全防范syn攻击;









本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
理解TCP中的三次握手
网络基础、TCP/IP 三次握手和四次挥手
TCP/IP学习笔记
TCP协议:三次握手,四次挥手
TCP的状态迁移图
TCP/IP,http,RPC、SOA、长连接短连接
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服