握手协议

程序员面试被问到“三次握手,四次挥手”怎么办?

不问归期 提交于 2019-12-01 19:13:12
作者 | 饶全成 责编 | 郭 芮 记得刚毕业找工作面试的时候,经常会被问到:你知道“3次握手,4次挥手”吗?这时候我会“胸有成竹”地“背诵”前期准备好的“答案”,第一次怎么怎么,第二次……答完就没有下文了,面试官貌似也没有深入下去的意思,深入下去我也不懂,皆大欢喜! 作为程序员,要有“刨根问底”的精神。知其然,更要知其所以然。这篇文章希望能抽丝剥茧,还原背后的原理。 什么是“3次握手,4次挥手”? TCP是一种面向连接的单播协议,在发送数据前,通信双方必须在彼此间建立一条连接。所谓的“连接”,其实是客户端和服务器的内存里保存的一份关于对方的信息,如ip地址、端口号等。 TCP可以看成是一种字节流,它会处理IP层或以下的层的丢包、重复以及错误问题。在连接的建立过程中,双方需要交换一些连接的参数。这些参数可以放在TCP头部。 TCP提供了一种可靠、面向连接、字节流、传输层的服务,采用三次握手建立一个连接。采用4次挥手来关闭一个连接。 TCP服务模型 在了解了建立连接、关闭连接的“三次握手和四次挥手”后,我们再来看下TCP相关的东西。 一个TCP连接由一个4元组构成,分别是两个IP地址和两个端口号。一个TCP连接通常分为三个阶段:启动、数据传输、退出(关闭)。 当TCP接收到另一端的数据时,它会发送一个确认,但这个确认不会立即发送,一般会延迟一会儿。ACK是累积的

TCP三次握手/四次挥手详解

倖福魔咒の 提交于 2019-12-01 19:08:08
版权声明: 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。 http://justim.blog.51cto.com/740099/237548 TCP(Transmission Control Protocol) 传输控制协议 TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 位码即tcp标志位,有6种标示:SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急) Sequence number(顺序号码) Acknowledge number(确认号码) 第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机; 第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=7654321的包 第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1

TCP 3次握手及4次挥手

怎甘沉沦 提交于 2019-12-01 18:52:34
3次握手: TCP协议建立三次握手的过程如下:   第一次握手:客户端向服务器发送SYN段(SYN=1),请求建立新连接   第二次握手:服务器收到SYN段后,向客户端发送的SYNACK段(SYN=1,ACK=1)进行确认,同意建立新连接   第三次握手:客户端收到服务器的SYNACK段后,向服务器发送ACK确认段(ACK=1),并确认连接建立成功;服务器收到ACK确认段后,也确认连接建立成功 原因:  1)为了确保连接建立的双方彼此完全清楚对方状态(如初始序列号和接收窗口大小),从而保证可靠、稳定地建立连接  2)通过三次握手建立连接还可以有效地预防过期、失效的连接请求到达后,导致无效连接的建立  3)两次握手建立连接是不可行的,因为网络存在数据丢失;第二次握手控制段可能丢失,这样主动发起连接的一方由于没有收到第二次握手控制段,则无法建立连接,而接受连接建立的一方则认为连接已经建立,从而出现无效链接 有种情况就是客户端发起了请求,但是过了超时时间又重发的连接请求,而第一个请求并没有丢失,服务端收到syn后,发送了ACK,确认了连接,客户端收到ACK也确认了连接。 这时第二次发送的连接请求阻塞在网络上,但没有丢失,并最终在客户端断开连接后,到达了服务器,此时服务器会理解为新的连接请求,并发送ACK确认连接建立 这一连接并不属于有效连接,属于半连接,但是服务器已经为该连接分配了资源

通俗大白话来理解TCP协议的三次握手和四次分手

谁说胖子不能爱 提交于 2019-12-01 18:52:05
为什么80%的码农都做不了架构师?>>> 通俗大白话来理解TCP协议的三次握手和四次分手 #14 jawil commented on 25 Apr • edited 最近在恶补计算机网络方面的知识,之前对于TCP的三次握手和四次分手也是模模糊糊,对于其中的细节更是浑然不知,最近看了很多这方面的知识,也在系统的学习计算机网络,加深自己的CS功底,就把看过的一些比较好的东西和自己的一些理解二次加工组织一下然后交流分享,一起学习进步,对了这个面试好像经常问到。 原文收录在我的 GitHub博客 ( https://github.com/jawil/blog ) ,喜欢的可以关注最新动态,大家一起多交流学习,共同进步,以学习者的身份写博客,记录点滴。 通俗理解: 但是为什么一定要进行三次握手来保证连接是双工的呢,一次不行么?两次不行么?我们举一个现实生活中两个人进行语言沟通的例子来模拟三次握手。 引用网上的一些通俗易懂的例子,虽然不太正确,后面会指出,但是不妨碍我们理解,大体就是这么个理解法。 第一次对话: 老婆让甲出去打酱油,半路碰到一个朋友乙,甲问了一句:哥们你吃饭了么? 结果乙带着耳机听歌呢,根本没听到,没反应。甲心里想:跟你说话也没个音,不跟你说了,沟通失败。说明乙接受不到甲传过来的信息的情况下沟通肯定是失败的。 如果乙听到了甲说的话,那么第一次对话成功,接下来进行第二次对话。

HTTP3次握手和4次挥手

元气小坏坏 提交于 2019-12-01 18:47:49
Http协议属于ISO7层模型中的应用层,TCP协议属于IOS7层模型中的传输层,所以Http是比TCP更高层的协议。 Http的3次握手: 第一次握手:客户端发送一个带SYN的TCP报文到服务器,表示客户端想要和服务器端建立连接。 第二次握手:服务器端接收到客户端的请求,返回客户端报文,这个报文带有SYN和ACK确认标示,访问客户端是否准备好。 第三次握手:客户端再次响应服务端一个ACK确认,表示我已经准备好了。 Http的4次挥手: 第一次挥手:TCP发送一个FIN(结束),用来关闭客户端到服务器端的连接。 第二次挥手:服务器端收到这个FIN后发回一个ACK确认标示,确认收到。 第三次挥手:服务器端发送一个FIN到客户端,服务器端关闭客户端的连接。 第四次挥手:客户端发送ACK报文确认,这样关闭完成。 下面用实验来说明HTTP的3次握手和4次挥手: 编写服务代码: < % @ page contentType = "text/html;charset=UTF-8" language = "java" % > < html > < head > < title > Title < / title > < / head > < body > < % try { Thread . sleep ( 10 * 1000 ) ; //睡眠10秒钟 } catch (

TCP三次握手,四次握手过程原理

六月ゝ 毕业季﹏ 提交于 2019-12-01 18:47:20
为什么TCP要进行三次握手 在谢希仁着“计算机网络”第四版中讲“三次握手”的目的是“ 为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。 “在另一部经典的”计算机网络“(Andrew S.Tanenbaum着,第四版)一书中讲”三次握手“的目的是为了解决 ”网络中存在延迟的重复 分组 “的问题 。这两种不同的表述其实阐明的是同一个问题。 TCP TCP(传输控制协议,传输控制协议)是一种面向连接的,可靠的,基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内另一个重要的传输协议。在因特网协议族(Internet protocol suite)中, TCP层是位于IP层之上,应用层之下的中间层 。不同主机的应用层之间经常需要可靠的,像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。 UDP一般用于即时通信(QQ聊天 对 数据准确性和丢包要求比较低,但速度必须快 ),在线视频(RTSP 速度一定要快,保证视频连续,但是偶尔花了一个图像帧,人们还是能接受的),网络语音电话(VoIP 语音数据包一般比较小,需要高速发送,偶尔断音或串音也没有问题)等等。 应用层向TCP层发送用于网间传输的,用8位字节表示的数据流,然后TCP把数据流分区成适当长度的

为什么TCP需要三次握手和四次挥手

。_饼干妹妹 提交于 2019-12-01 18:38:28
因为HTTP是一个基于TCP的协议,而TCP是一种可靠的传输层协议. 建立TCP连接时会发生:三次握手(three-way handshake) firefox > nginx [SYN] 在么 nginx > firefox [SYN, ACK] 在 firefox > nginx [ACK] 知道了 关闭TCP连接时会发生:四次挥手(four-way handshake) firefox > nginx [FIN] 我要关闭连接了 nginx > firefox [ACK] 知道了,等我发完包先 nginx > firefox [FIN] 我也关闭连接了 firefox > nginx [ACK] 好的,知道了 几个报文的标识的解释: SYN: synchronization(同步) ACK: acknowledgement(确认:告知已收到) FIN: finish(结束) 在HTTP/1.1中,keep-alive能够复用TCP连接,减少TCP三次握手的次数,从而提升性能. 结合到PHP编程中,拿Swoole引擎内置的异步HTTP服务器来说说: 调用 $res->end() 将结束HTTP请求,但不会关闭HTTP连接,因为Swoole支持keep-alive. 调用 $serv->close($res->fd) 将关闭HTTP连接.

网络编程协议详解

不羁岁月 提交于 2019-12-01 11:26:17
OSI分层 (7层):物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。 TCP/IP分层(4层):网络接口层、 网际层、运输层、 应用层。 五层协议 (5层):物理层、数据链路层、网络层、运输层、 应用层。 每一层的协议如下: 物理层:RJ45、CLOCK、IEEE802.3 (中继器,集线器) 数据链路:PPP、FR、HDLC、VLAN、MAC (网桥,交换机) 网络层:IP、ICMP、ARP、RARP、OSPF、IPX、RIP、IGRP、 (路由器) 传输层:TCP、UDP、SPX 会话层:NFS、SQL、NETBIOS、RPC 表示层:JPEG、MPEG、ASII 应用层:FTP、DNS、Telnet、SMTP、HTTP、WWW、NFS 每一层的作用如下: 物理层:通过媒介传输比特,确定机械及电气规范(比特Bit) 数据链路层:将比特组装成帧和点到点的传递(帧Frame) 网络层:负责数据包从源到宿的传递和网际互连(包PackeT) 传输层:提供端到端的可靠报文传递和错误恢复(段Segment) 会话层:建立、管理和终止会话(会话协议数据单元SPDU) 表示层:对数据进行翻译、加密和压缩(表示协议数据单元PPDU) 应用层:允许访问OSI环境的手段(应用协议数据单元APDU) 传输层协议:TCP协议、UDP协议 应用层协议:FTP、HTTP、SMTP 网络层协议

看完让你彻底搞懂Websocket原理

☆樱花仙子☆ 提交于 2019-12-01 08:23:28
看完让你彻底搞懂Websocket原理 偶然在知乎上看到一篇回帖,瞬间觉得之前看的那么多资料都不及这一篇回帖让我对 websocket 的认识深刻有木有。所以转到我博客里,分享一下。比较喜欢看这种博客,读起来很轻松,不枯燥,没有布道师的阵仗,纯粹为分享。废话这么多了,最后再赞一个~ 一、websocket与http WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算) 首先HTTP有 1.1 和 1.0 之说,也就是所谓的 keep-alive ,把多个HTTP请求合并为一个,但是 Websocket 其实是一个新协议,跟HTTP协议基本没有关系,只是为了兼容现有浏览器的握手规范而已,也就是说它是HTTP协议上的一种补充可以通过这样一张图理解 有交集,但是并不是全部。 另外Html5是指的一系列新的API,或者说新规范,新技术。Http协议本身只有1.0和1.1,而且跟Html本身没有直接关系。。通俗来说,你可以用HTTP协议传输非Html数据,就是这样=。= 再简单来说,层级不一样。 二、Websocket是什么样的协议,具体有什么优点 首先,Websocket是一个持久化的协议,相对于HTTP这种非持久的协议来说。简单的举个例子吧,用目前应用比较广泛的PHP生命周期来解释。

面试官,不要再问我三次握手和四次挥手

∥☆過路亽.° 提交于 2019-12-01 02:46:08
三次握手和四次挥手是各个公司常见的考点,也具有一定的水平区分度,也被一些面试官作为热身题。很多小伙伴说这个问题刚开始回答的挺好,但是后面越回答越冒冷汗,最后就歇菜了。 见过比较典型的面试场景是这样的: 面试官:请介绍下三次握手 求职者:第一次握手就是客户端给服务器端发送一个报文,第二次就是服务器收到报文之后,会应答一个报文给客户端,第三次握手就是客户端收到报文后再给服务器发送一个报文,三次握手就成功了。面试官:然后呢?求职者:这就是三次握手的过程,很简单的。面试官:。。。。。。(番外篇:一首凉凉送给你) 记住猿人谷一句话: 面试时越简单的问题,一般就是隐藏着比较大的坑,一般都是需要将问题扩展的 。上面求职者的回答不对吗?当然对,但距离面试官的期望可能还有点距离。 希望大家能带着如下问题进行阅读,收获会更大。 请画出三次握手和四次挥手的示意图 为什么连接的时候是三次握手,关闭的时候却是四次握手? 什么是半连接队列? ISN(Initial Sequence Number)是固定的吗? 三次握手过程中可以携带数据吗? 如果第三次握手丢失了,客户端服务端会如何处理? SYN攻击是什么? 挥手为什么需要四次? 四次挥手释放连接时,等待2MSL的意义? 1. 三次握手 三次握手(Three-way Handshake)其实就是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。