TCP协议三次握手与四次挥手详解

基础知识:TCP报文

其中比较重要的字段有:

(1)序号(sequence number):Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。可以这样理解,我发送1m数据,第一个包如果200k,我发五次,第一次包的序列号为200,第二次为400,以此类推;(第一次建立连接不适用这种说法,下文有说明)

(2)确认号(acknowledgement number):Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。之所以在序列号基础上加1,是因为明确告诉发送方,你seq=200的数据包我收到了,你下次给我发200+1开始的数据包,以此类推;主要保障数据可靠,因为TCP是可靠的协议。

(3)标志位(Flags):在保留和窗口之间,共6个,即URG、ACK、PSH、RST、SYN、FIN等。具体含义如下:

URG:紧急指针(urgent pointer)有效。

ACK:确认序号有效。

PSH:接收方应该尽快将这个报文交给应用层。

RST:重置连接。

SYN:发起一个新连接。

FIN:释放一个连接。

需要注意的是:

不要将确认序号Ack与标志位中的ACK搞混了。确认方Ack=发起方Seq+1,两端配对。

tcp协议是全双工的,三次握手;

首先由Client发出请求连接即 SYN=1 ACK=0  (请看头字段的介绍), TCP规定SYN=1时不能携带数据,但要消耗一个序号,因此声明自己的序号是 seq=x。SYN=1 表示这是一个连接请求或连接接收报文。当SYN=1,ACK=0时,表明这是一个连接请求报文,对方若同意建立连接,则在响应报文中使用SYN=1,ACK=1。即,SYN=1就表示这是一个连接请求或连接接收报文。

然后 Server 进行回复确认,即 SYN=1 ACK=1 seq=y, ack=x+1,

再然后 Client 再进行一次确认,但不用SYN 了,这时即为 ACK=1, seq=x+1, ack=y+1.
 

常见问题:

为神魔要三次握手,需要验证tcp的序列号seq,保证传输正确及确保双边发送及接受请求都没有问题;网上说什么防止过时延误数据重新建立连接这种说法有一定道理,说服力不强。根据我说的原理理解,你可以知道他们可以彼此确认双方的序列号都正确,后续发送可靠,同时验证双方的发送接收请求能力没有问题。

tcp协议是全双工的,四次挥手;

常见问题:

为什么要四次挥手,因为tcp是全双工,双方都要发送确认及完成报文;

出现大量close-wait一般是程序异常导致,编码问题,严重导致句柄数耗尽。

额外补充

可以使用tcpdump和wireshark查看三次握手与四次挥手,例如访问www.baidu.com,并且使用wireshark可以明显看到每个连接的具体协议及其每个协议的分层信息,如下图所示:

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值