前言
简单来说,三次握手和四次挥手就是客户端和服务端之间互相确立的过程。 SYN:连接请求/接收 报文段(SYN = 1 表示这是一个连接请求或连接接受报文) seq:客户端的初始化序列号 ACK:确认报文段(ACK = 1 时确认号字段才有效,当 ACK = 0 时确认号无效) ack:确认号。希望收到的下一个数据的第一个字节的序号
三次握手
三次握手用于连接数据,是为了建立可靠的通信信道,以确认双方的接受能力和发送能力是否正常。 过程: 第一次:客户端 ----我想连接,我的序列号是100----> 服务端 第二次:客户端 <----我可以和你连接,我的序列号是200,返回数据给你了---- 服务端 第三次:客户端 ----收到了,我将带着返回的数据去请求----> 服务端
三次握手过程中可以携带数据吗?
第三次握手可以,因为已经在第一次第二次中确认过了;第一次和第二次握手不可以,因为第一次还没有确定好,如果这个时候有人恶意攻击网站,那么在第一次我收的时候他投入大量的数据在这里的话,服务器就要花很长的时间以及很大的内存去接收,所以不行。 如果第三次握手丢失了,客户端服务端会如何处理
如果第三次握手丢失了怎么办?
服务器就会进行首次重传,若等待一段时间仍未收到客户确认包,就进行第二次重传。如果重传次数超过系统规定的最大重传次数,则系统将该连接信息从半连接队列中删除。
四次挥手
四次挥手用于断开连接,是拆除两条通道并释放资源。
过程: 第一次:客户端 ----我没有数据要给你发送了,我要断开连接,我的序列号是300----> 服务端 第二次:客户端 <----知道你要断断开连接了,收到你的序列号是300的数据了,正在跟你断开连接,请稍等---- 服务端 第三次:客户端 <----断开连接了,我这条数据的序列号是400---- 服务端 第四次:客户端 -----收到你的序列号是400的数据了,知道你要断开连接了----> 服务端
为什么挥手是四次?
TCP是全双工的,这是因为服务端的 LISTEN 状态下的 SOCKET 当收到 SYN 报文的建连请求后,它可以把 ACK 和 SYN(ACK 起应答作用,而 SYN 起同步作用)放在一个报文里来发送。但关闭连接时,ACK是服务器一收到FIN报文底层就回发的,而服务器B的FIN是应用层调用close()激发的,所以它这里的 ACK 报文和 FIN 报文在发送的时间上都是分开的,不可能同时发送。
|