博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TCP的三次握手,四次挥手建立连接过程
阅读量:2430 次
发布时间:2019-05-10

本文共 1046 字,大约阅读时间需要 3 分钟。

TCP的三次握手

在这里插入图片描述

三次握手是指建立TCP连接协议时,需要在客户端和服务器之间发送三个包,握手过程中传送的包里不含数据,三次握手完毕,客户端与服务器才正式开始传送数据

第一次握手:客户端发送第一个包,其中SYN(建立连接时用来同步序号)标志位为1,ACK(表明确认号字段有效)为0,发送初始序号seq=x(随机的int值)

第二次握手:服务端收到客户端发送来的包后,便向客户端发送第二个包,ACK为1(ACK为1表明向客户端表达确认收到客户端传来的包),确认号ack=x+1;因为连接是双向的,所以服务器也向客户端发出连接请求,在第二个包中,应将SYN标志置为1,发送序列号seq=y(随机int)
第三次握手:客户端收到服务器传来的包后,向服务器发送第三个包,向服务器发出确认,ACK置为1,SYN为0,确认号为ack=y+1,发送顺序号seq=x+1
在这里插入图片描述

仅使用二次握手而不适用三次握手会怎么样

假定客户端给服务器发送一个连接请求报文段,服务器收到这个报文段,并发送了确认应答报文段。按照两次握手的协定,服务器认为连接已经成功建立,可以开始发送数据报文段

但是在另一方面,客户端在服务器的应答报文段在传输中被丢失的情况下,将不知道服务器是否已准备好,不知道服务器建议用什么样的序列号用于服务器到客户端的传输,也不知道服务器是否同意客户端的初始序列号,客户端甚至怀疑服务器是否收到自己的连接请求报文段;在这种情况下,客户端会认为连接还未成功,将丢弃服务器法来的任何数据报文段,只等待接受连接确认应答报文段,而服务器在法出的数据报文段超时后,重复发送同样的报文段,就会造成死锁

TCP四次挥手

在这里插入图片描述

第一次挥手:主动关闭方发送第一个包,其中FIN标志位为1,发送顺序号seq=m
第二次挥手:被动关闭方收到释放连接的通知后,即发出确认,FIN需要消耗一个序号,所以其确认号为ack=m+1,并将ACK标志置为1,这样从主机到服务器的连接就关闭了,此时连接处于半关闭状态,但如果服务器还发送数据,主机仍能接受(只是关闭了主机到服务器的连接,服务器到主机的连接还未关闭)
第三次挥手服务器向主机的数据发送结束后,TCP释放服务器到主机的连接。服务器发出一个包,其中的FIN标志位为1,发送序列号seq=n,因为标志位ACK不需要消耗序号,所以此时的ack仍为ack=m+1
第四次挥手:主机必须向服务器发出确认 ,因为FIN标志需要消耗一个序列,所以给出的确认号为ack=n+1
最终,双方连接释放全部完成

转载地址:http://hljmb.baihongyu.com/

你可能感兴趣的文章
基础算法面试题---如何用队列实现栈(2)
查看>>
基础算法面试题---如何数组实现栈和队列
查看>>
基础算法面试题---获取栈的最小值
查看>>
基础算法面试题---滑动窗口的最大值
查看>>
API接口安全性设计以及各参数的作用
查看>>
《Netty权威指南 第2版》学习笔记(1)---服务端与客户端开发入门
查看>>
《Netty权威指南 第2版》学习笔记(6)--- HTTP协议开发应用
查看>>
链表算法面试题---删除链表中的重复元素II
查看>>
基础算法面试题---合并有序链表
查看>>
链表算法面试题---从链表中删除给定的节点
查看>>
链表算法面试题---删除链表倒数第N个节点
查看>>
链表算法面试题---环形链表
查看>>
链表算法面试题---环形链表II
查看>>
链表算法面试题---删除链表节点(给的不是头节点)
查看>>
链表算法面试题---合并两个链表
查看>>
链表算法面试题---旋转链表
查看>>
链表算法面试题---交换链表的节点I
查看>>
链表算法面试题---交换链表的节点II
查看>>
链表算法面试题---链表的插入排序
查看>>
链表算法面试题---链表的归并排序
查看>>