下面整理下TCP握手和挥手的几个问题,参考资料小林图解计算机网络

1、什么是三次握手?

  • Client端向Server端发送SYN为1的报文段,携带一个初始序列号x,client端进入SYN_SENT状态
  • Server端收到报文段后,向Client端发送ACK为1,SYN=1的报文段,携带确认号ack为x+1,初始序列号y,Server端进入SYN_RECIVD状态
  • Client收到Server回答的报文段后,还会向Server发送一个ACK为1,携带确认号y+1的报文段,这次握手可以携带数据,Client,Server进入ESTABLISHED状态

2、 为什么不能是两次或者多次

倘若只有两次握手的话,Server端就在收到Client端的连接请求报文后就进入了ESTABLISHED状态,如果Client端发送了两个建立连接的请求,如一个旧的SYN报文由于网络问题堵塞,再发送了一个新的SYN报文,旧的SYN先送到Server端,Server没有给Client机会纠错,这样导致Server端浪费资源建立了一个错误的历史链接,只有给客户端发送消息,客户端判断是错误连接,发送RST报文来断开连接,Server端浪费了资源和数据,这是使用三次握手的主要原因,避免建立历史链接,避免资源浪费,除此之外,如果只有两次握手,只有Client端将自己的初始序列号同步到Server端,Server端不能保证自己的初始序列号被对方成功接收

总结不使用二次握手的原因就是一是避免建立历史链接造成资源浪费,二是二次握手不能保证双方初始序列号同步成功

而不使用多次连接就更简单了,完全可靠的通信协议是不存在的,经过三次握手之后,Client端和Server端已经确认了通信状况,就没必要增加握手次数了

3、Client端什么情况下会收到错误的ack,如何解决的

如果Client先发送了一个旧的SYN报文段,但是由于网络堵塞的原因,Client又发送了新的SYN报文段,这时候旧的SYN报文段送到了Server端,Server端发回一个SYN+ACK的报文段,确认号ack为旧的SYN+1,Client就收到了一个错误的ack了,这时候Client会发送一个RST为1的报文段给Server端,断开连接

4、什么是四次挥手

  • Client端向Server端发送FIN为1的报文段,携带序列号u,Client端进入FIN-WAIT-1阶段
  • Server端接收到报文段后,返回一个ACK为1,确认号为u+1的报文段,携带序列号v,Server端进入CLOSE-WAIT状态,Client收到报文段后进入FIN-WAIT-2状态,这时候TCP处于半连接状态
  • 等到Server端没有数据发送回Client端后,Server会发送一个请求断开连接的报文段,FIN-ACK为1,携带序列号w,确认号为u+1,Server端进入LAST-ACK状态
  • Client端收到报文段后,会发送一个ACK为1的报文段,携带序列号为u+1,确认号ack为w+1,进入TIME-WAIT状态,Server端收到后进入CLOSE状态,Client端等待2个最长报文生命周期时间后进入CLOSE状态

5、TCP四次挥手可以变成三次吗,能不能把第二个ack报文段放到第三次FIN报文段中一起发送?

答案是有时候是可以的,但是控制权并不在内核,而是在Server端的应用进程,如果Server端没有数据要发送,也是可以合并为一次挥手的

6、Client为什么要经过TIME-WAIT2个最长报文周期的长度才进入Close阶段?

一是因为要保证Client发给Server端的ACK报文段被成功接收,倘若最后的ACK报文段丢失了,那么Server端就会超时重新发送FIN-ACK报文段給Client端,Client就会发送ACK报文段,直到Server端收到ACK报文段,如果没有这2个最长报文生命周期等待时间直接进入Close端,那么Server一旦收不到ACK报文段,就一直处于LAST-ACK阶段,不能正常CLOSE。

TCP三次握手一二三问的更多相关文章

  1. 硬不硬你说了算!35 张图解被问千百遍的 TCP 三次握手和四次挥手面试题

    每日一句英语学习,每天进步一点点: 前言 不管面试 Java .C/C++.Python 等开发岗位, TCP 的知识点可以说是的必问的了. 任 TCP 虐我千百遍,我仍待 TCP 如初恋. 遥想小林 ...

  2. 阿里二面,面试官居然把 TCP 三次握手问的这么细致

    TCP 的三次握手和四次挥手,可以说是老生常谈的经典问题了,通常也作为各大公司常见的面试考题,具有一定的水平区分度.看似是简单的面试问题,如果你的回答不符合面试官期待的水准,有可能就直接凉凉了. 本文 ...

  3. 面试官问我TCP三次握手和四次挥手,我真的是

    候选者:面试官你好,请问面试可以开始了吗 面试官:嗯,开始吧 面试官:今天来聊聊TCP吧,TCP的各个状态还有印象吗? 候选者:还有些许印象的,要不我就来简单说下TCP的三次握手和四次挥手的流程吧 候 ...

  4. TCP三次握手四次挥手详解

    转载 http://www.cnblogs.com/zmlctt/p/3690998.html 相对于SOCKET开发者,TCP创建过程和链接折除过程是由TCP/IP协议栈自动创建的.因此开发者并不需 ...

  5. TCP三次握手及四次挥手详细图解

    TCP三次握手及四次挥手详细图解 Andrew Huangbluedrum@163.com    相对于SOCKET开发者,TCP创建过程和链接折除过程是由TCP/IP协议栈自动创建的.因此开发者并不 ...

  6. TCP三次握手四次断开

    今天被问到三次握手了,当时只是脑子里有印象,却忘了一些SYN细节,手动微笑. 这么下去还怎么混...赶紧复习个... 三次握手是什么? TCP是面向连接的,无论哪一方向另一方发送数据之前,都必须先在双 ...

  7. TCP三次握手的过程

    三次握手 下图就是wireshark抓包工具抓获的TCP连接建立的三次握手过程: http://www.cnblogs.com/hnrainll/archive/2011/10/14/2212415. ...

  8. TCP三次握手那些事

    临近5月,春招和实习招聘逐渐进入尾声.本文主要讨论面试中经常提问的TCP连接的机制,附带一些扩展知识. 参加面试的时候,过半的面试官都会问TCP相关问题,而最常见的问题就是:讲一下TCP三次握手(四次 ...

  9. 脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手

    .引言 网络编程中TCP协议的三次握手和四次挥手的问题,在面试中是最为常见的知识点之一.很多读者都知道“三次”和“四次”,但是如果问深入一点,他们往往都无法作出准确回答. 本篇文章尝试使用动画图片的方 ...

  10. [转帖]脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手

    脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手   http://www.52im.net/thread-1729-1-1.html     1.引言 网络编程中TCP协议的三次握手和 ...

随机推荐

  1. 微信小程序——计算器

    知识点: wxml: hover-class: 实现点击态效果 hover-class样式显示的原理是 点击时把样式加到class的样式中,冲突时,谁在后面就显示谁! data-val: 用于传数据, ...

  2. xmake构建C/C++编译环境

    1. xmake介绍 XMake是一个基于Lua的轻量级跨平台自动构建工具,支持在各种主流平台上构建项目 xmake的目标是开发者更加关注于项目本身开发,简化项目的描述和构建,并且提供平台无关性,使得 ...

  3. vue中关于get传参数为数组的解决方法

    按理来说,get请求方式是没有数组的,get请求方式带参数都是字符串,需要和后端协商是用某个标识符分割开,例如"|"   ",". 当然如果需要数组的话,也能解 ...

  4. 二叉树系列之二叉搜索树BST

    特征: 1.每个元素有唯一键值 2.任意一个结点键值,比它左子树的所有结点的键值大,比它右子树的所有结点的键值小 数据的基本操作: 1>建树和插入.逐个插入其他所有数据.新插入的数据于一个最底层 ...

  5. Jetlinks物联网基础平台 前端运行项目遇到的问题

    电脑中的环境要必备 node.js和yarn(需要将他们都添加到环境变量中,否则会报错) 1.在github上面拉取代码 $ git clone https://github.com/jetlinks ...

  6. #Python #字符画 #灰度图 使用Python绘制字符画及其原理

    由于最近身体状况不太好所以更新会有点慢,请大家多多包涵.同时也提醒大家注意保重身体! 前提:默认大家已经正确安装了 Python,且正确将Python配置到了系统Path . 目录 1.字符画的概况 ...

  7. python投票一致性指数(IVC)实现代码

    毕业论文中用于计算联合国会员国间在联合国大会上的投票一致性(IVC) import pandas as pd import sqlite3 import networkx as nx import t ...

  8. 20220720 第七组 陈美娜 Java String用法

    关于String引用数据类型 1.字符串中,两个变量的==指的是虚地址 2.String一旦声明不可改变:赋值进去,原值不会被替代.原值也可能指向其他地址: 3.s.length():字符的个数 4. ...

  9. P1296 奶牛的耳语

    P1296 奶牛的耳语 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 本题核心思路: 1.读入后要排序以达到剪枝的目的 2.模拟,遇到不能再交流就转入下一头牛,否则计数器加一 3. ...

  10. Java的由来

    Java 发展史 1.1.起源 20 世纪 90 年代,单片式计算机系统诞生,单片式计算机系统不仅廉价,而且功能强大,使用它 可以大幅度提升消费性电子产品的智能化程度. SUN 公司为了抢占市场先机, ...