四次挥手下次在说,篇幅太长也不爱看
先搞懂三次握手,有问题留言,小编解答
网络时代,网络编程怎么可以缺席!我们通常使用的网络模型是位于OSI(七层)模型和TCP/IP(四层)模型之间的五层模型(应用层,传输层,网络层,数据链路层,物理层),我们使用套接字来实现端到端(即进程到进程)任务
而这“握手”和“挥手”位于传输层,传输层主要有TCP协议和UDP协议
套接字=
ip地址定位到主机,端口号定位进程
我们知道,TCP协议有建立连接,传输数据,释放连接三个阶段。
TCP连接建立,分三步骤,即三次握手
此为C/S模式,即Client/Server
(1)“唤醒服务器”作用:客户机(Host)的TCP向服务器(Server)TCP连接发送请求报文段,让Host端和Server端达到同步,即要使该报文段中SYN(同步位,Synchronize)标志位置为1。此外,客户端会选择一个起始序号seq(sequence)=x,即从哪开始
(2)”服务器端准备“作用:Server的TCP收到连接请求报文后,如同意连接,则回复确认,并为该TCP连接分配TCP缓存和相关变量。在确认报文中,SYN和ACK位都置为1,确认号字段为x+1,且随机产生服务器的起始序号seq=y,即从哪开始
注意:确认号ack是对收到客户机的报文进行确认,另一层含义表示期望收到下一个报文的序号
(3)”客户端准备“作用:当客户机收到(2)中确认报文段后,还要向服务器给出确认。同时,客户端也为该TCP连接分配缓存和变量。这个报文段中ACK标志。
注意:ACK位置1,序号字段为x+1(从上面x开始的),确认号为ack=y+1与ack都是确认号,但是不同,ACK表示只有ACK=1时,此报文段才有效,为0表示无效。而ack的作用在(2)注意中
问题:有的人可能会觉得第三次握手没必要,即客户直接分配变量和缓存后可开始传送数据,不必再次确认
我答:我们知道,网络传输随时都有可能丢失数据,而这第三次握手就是为了防止两次握手情况下已经失效的连接请求报文段突然又传送到服务器端(即先滞留在网络中,当重传完成后,又传到)而产生错误。
举例说明:若第一次握手时,Client端的请求连接报文段因为网络问题,滞留在了网络中(假设 滞留时间>传输数据时间),超时后Client端认为其丢失,再次重新发送另一个连接请求报文,Server端收到后建立了连接,传输数据完成后,滞留的请求报文段才达到服务器端,而服务器不知道,便以为客户端要再次建立连接,若此时使用三次握手,连接就会失败;若采用两次握手,服务器便以为已建立了连接,就等待Client端发送数据,而客户端又实际无连接请求,因此不予理睬,这样就造成了资源的浪费。
本文属于原创,如有疑问请后台留言,如有转载请标注原作者,版权归本公众号所有。如果你喜欢我写的文章请关注微信公众号 Java资源社区,欢迎大家继续关注本公众号的技术博文。如果您觉得本文章对你有所帮助的话,不妨点个赞,您的支持就是我坚持原创的动力。
领取专属 10元无门槛券
私享最新 技术干货