前端面试——TCP/IP 的三次握手/四次挥手—结尾总结建议自己梳理全文背诵!

想要能够清晰迅速的理解TCP/IP的三次握手,四次挥手,必须对TCP的报文格式有了解,从中找到突破口,否则很难明白理解贯通!只是单纯的背诵回答,面对面试官也不能做到逻辑清晰表达!结尾内容是一个个人梳理,理解后建议背诵!

1:下图是TCP报文的数据格式,这里只针对三次握手,四次挥手所用到的进行了说明。
在这里插入图片描述

1:TCP报文是TCP层传输的数据单元,也叫报文段。
2:序号确认号是TCP可靠传输的关键部分。
3:序号:表示本报文段所发送数据的第一个字节的编号。在TCP连接中所传送的字节流的每一个字节都会按顺序编号。
4:确认号:表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。也就是告诉发送发:我希望你(指发送方)下次发送的数据的第一个字节数据的编号是这个确认号。
5:控制位:URG ACK PSH RST SYN FIN,共6个,每一个标志位表示一个控制功能。

其中:

1:ACK:确认序号标志,为1时表示确认号有效,为0表示报文中不含确认信息,忽略确认号字段。ACK=1,表示有效。只有当ACK=1时,前面的确认号字段才有效。TCP规定,连接建立后,ACK必须为1。

2:FIN:finish标志,用于释放连接,为1时表示发送方已经没有数据发送了,即关闭本方数据流。标记数据是否发送完毕。如果FIN=1,就相当于告诉对方:“我的数据已经发送完毕,你可以释放连接了”

3:SYN:表示是否前面的确认号字段是否有效。ACK=1,表示有效。只有当ACK=1时,前面的确认号字段才有效。TCP规定,连接建立后,ACK必须为1。

至此,有了上面的基本内容,再去理解TCP/IP三次握手,四次挥手就会容易的多!!
在这里插入图片描述
2:三次握手过程简述:

1:客户端发起请求建立连接,数据报文中标志位SYN=1(表示建立连接),同时要生成一个随机的32位序列号seq=x
2:服务端serve收到后就知道,客户端想要建立连接,于是发送一个数据报文,其中SYN=1,也会生成一个序列号seq=y,还会有一个标志位ACK=1(表示确认号有效),同时还有一个ack(确认号)=x+1,此时表示服务端告诉客户端,接下来你给我发的数据报文要从x+1开始。
(此时,对于客户端而言,我给服务端发送信息,服务端回复我了,同时我能收到服务端的信息,说明客户端这边是没问题的。但是服务端发给客户端的报文,客户端一定能收到吗?)
3:为了安全,为了可靠,显然两次握手达不到这个目的,服务端只能知道我能收到客户端信息,但是客户端能不能收到我的信息还不确定。所以客户端在收到服务端的消息后,立马返回给服务端一个信息,其中ACK=1,ack=y+1,道理同上,至此两方面通信都可以进行
4:(上图中,ACK为标志位,seq为序号,ack为确认号序列)。

3:四次挥手过程简述:

1:服务端要断开连接,发送报文中的标志位FIN=1,seq也是有的但不是随机生成的,而是随着通信的进行不断叠加的,假设到seq=x+2。
2:服务端进行应答,其中标志位ACK=1,ack=y+1,于是客户端就知道服务端已经收到了我的消息
3:服务端向客户端发送报文消息,其中FIN=1,seq=*,此时服务端得到的消息是,客户端不会在向我发送数据报文了,客户端已经准备好断开了,但是服务端可能还有消息给客户端?所以2.3次握手是不能合并的。
4:客户端同理进行应答,其中ACK=1,ack=**,至此成功的断开连接。
注意:TCP/IP连接是安全的,是建立在连接上的。TCP 使用四次挥手的原因是因为 TCP 的连接是全双工的,所以需要双方分别释放到对方的连接,单独一方的连接释放,只代 表不能再向对方发送数据,连接处于的是半释放的状态。

4:面试场景回答如下(建议梳理成自己的方式,熟悉表达)

面试官你好,这个问题我是知道的:TCP/IP 协议是传输层的一个面向连接的安全可靠的一个传输协议,三次握手的机制是为了保证能建立一个安全可靠的连接,那么第一次握手是由客户端发起的,客户端会向服务端发送一个报文,在报文里面:SYN标志位置为1,表示发起新的连接。当服务端收到这个报文之后就知道客户端要和我建立一个新的连接,于是服务端就向客户端发送一个确认消息包,在这个消息包里面:ack标志位置为1,表示确认客户端发起的第一次连接请求。以上两次握手之后,对于客户端而言:已经明确了我既能给服务端成功发消息,也能成功收到服务端的响应。但是对于服务端而言:两次握手是不够的,因为到目前为止,服务端只知道一件事,客户端发给我的消息我能收到,但是我响应给客户端的消息,客户端能不能收到我是不知道的。所以,还需要进行第三次握手,第三次握手就是当客户端收到服务端发送的确认响应报文之后,还要继续去给服务端进行回应,也是一个ack标志位置1的确认消息。通过以上三次连接,不管是客户端还是服务端,都知道我既能给对方发送消息,也能收到对方的响应。那么,这个连接就被安全的建立了。

四次挥手机制也是由客户端去发起,客户端会发送一个报文,在报文里面FIN位标志位置1,当服务端收到这个报文之后,我就知道了客户端想要和我断开连接,但是此时服务端不一定能做好准备,因为当客户端发起断开连接的这个消息的时候,对于服务端而言,他还有可能有未发送完的消息,他还要继续发送,所以呢,此时对于服务端而言,我只能进行一个消息确认,就是我先告诉服务端,我知道你要给我断开连接了,但是我这里边还可能没有做好准备,你需要等我一下,等会儿我会告诉你,于是呢,发完这个消息确认包之后,可能稍过片刻它就会继续发送一个断开连接的一个报文啊,也是一个FIN位置1的报文也是由服务端发给客户端的啊,这个报文表示服务端已经做好了断开连接的准备,那么当这个报文发给客户端的时候,客户端同样要给服务端继续发送一个消息确认的报文一共有四次,那么,通过这四次的相互沟通和连接,我就知道了**,不管是服务端还是客户端都已经做好了断开连接的准备**,于是连接就可以被断开了,这是我对三次握手和四次挥手的一个理解

常见问题:

1:为什么TCP需要三次握手?为什么两次不可以? 问题的答案其实已经在上面的内容里,这里精炼一下

1:为了实现可靠数据传输, TCP 协议的通信双方, 都必须维护一个序列号, 以标识发送出去的数据包中, 哪些是已经被对方收到的。 三次握手的过程即是通信双方相互告知序列号起始值, 并确认对方已经收到了序列号起始值的必经步骤
2:如果只是两次握手, 至多只有连接发起方的起始序列号能被确认, 另一方选择的序列号则得不到确认

2:为什么TCP需要握手这个操作?能不能不握手?

1:其实UDP协议中,是没有握手这个操作的。
2:这里就引出了 TCP 与 UDP 的一个基本区别, TCP 是可靠通信协议, 而 UDP 是不可靠通信协议。
3:TCP 的可靠性含义: 接收方收到的数据是完整, 有序, 无差错的。
4:UDP 不可靠性含义: 接收方接收到的数据可能存在部分丢失, 顺序也不一定能保证。
5:UDP 和 TCP 协议都是基于同样的互联网基础设施, 且都基于 IP 协议实现, 互联网基础设施中对于数据包的发送过程是会发生丢包现象的, 为什么 TCP 就可以实现可靠传输, 而 UDP 不行?
6:TCP 协议为了实现可靠传输, 通信双方需要判断自己已经发送的数据包是否都被接收方收到, 如果没收到, 就需要重发。 为了实现这个需求, 很自然地就会引出序号(sequence number)确认号(acknowledgement number) 的使用。
7:发送方在发送数据包(假设大小为 10 byte)时, 同时送上一个序号( 假设为 500),那么接收方收到这个数据包以后, 就可以回复一个确认号(510 = 500 + 10) 告诉发送方 “我已经收到了你的数据包, 你可以发送下一个数据包, 序号从 510 开始” 。
8:这样发送方就可以知道哪些数据被接收到,哪些数据没被接收到, 需要重发。

部分图文引用地址:https://blog.csdn.net/lengxiao1993/article/details/82771768
引用博文连接地址:https://blog.csdn.net/lengxiao1993/article/details/82771768

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
TCP/IP协议中的三次握手是为了在客户端和服务端建立一个安全可靠的连接。在第三次握手时,客户端能够发出第三次握手报文,表示已经接收到来自服务端的第二次握手报文,从而确认连接的建立。此时,服务端的状态会切换为ESTABLISHED,可以开始传输数据了。\[1\] 三次握手的过程如下: 1. 客户端发送一个连接请求报文给服务端,表示想要建立连接。 2. 服务端接收到请求后,发送一个确认报文给客户端,表示已经收到请求。 3. 客户端接收到确认报文后,再次向服务端发送一个确认报文,表示已经收到服务端的确认。 至于为什么不进行四次握手,实际上是可以的,即在服务端收到客户端的第一次连接请求后,可以将ACK和SYN分两次发送给客户端。但这样做会浪费资源,因为一次能完成的事情为什么要分为两次呢?所以,TCP/IP协议采用了三次握手的机制来建立连接。\[2\]\[3\] #### 引用[.reference_title] - *1* [TCP/IP协议三次握手四次挥手详解](https://blog.csdn.net/Q0717168/article/details/111933810)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [TCP三次握手四次挥手(详细+通俗)](https://blog.csdn.net/m0_38089031/article/details/108567936)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值