TCP三次握手一二三问
下面整理下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三次握手一二三问的更多相关文章
- 硬不硬你说了算!35 张图解被问千百遍的 TCP 三次握手和四次挥手面试题
每日一句英语学习,每天进步一点点: 前言 不管面试 Java .C/C++.Python 等开发岗位, TCP 的知识点可以说是的必问的了. 任 TCP 虐我千百遍,我仍待 TCP 如初恋. 遥想小林 ...
- 阿里二面,面试官居然把 TCP 三次握手问的这么细致
TCP 的三次握手和四次挥手,可以说是老生常谈的经典问题了,通常也作为各大公司常见的面试考题,具有一定的水平区分度.看似是简单的面试问题,如果你的回答不符合面试官期待的水准,有可能就直接凉凉了. 本文 ...
- 面试官问我TCP三次握手和四次挥手,我真的是
候选者:面试官你好,请问面试可以开始了吗 面试官:嗯,开始吧 面试官:今天来聊聊TCP吧,TCP的各个状态还有印象吗? 候选者:还有些许印象的,要不我就来简单说下TCP的三次握手和四次挥手的流程吧 候 ...
- TCP三次握手四次挥手详解
转载 http://www.cnblogs.com/zmlctt/p/3690998.html 相对于SOCKET开发者,TCP创建过程和链接折除过程是由TCP/IP协议栈自动创建的.因此开发者并不需 ...
- TCP三次握手及四次挥手详细图解
TCP三次握手及四次挥手详细图解 Andrew Huangbluedrum@163.com 相对于SOCKET开发者,TCP创建过程和链接折除过程是由TCP/IP协议栈自动创建的.因此开发者并不 ...
- TCP三次握手四次断开
今天被问到三次握手了,当时只是脑子里有印象,却忘了一些SYN细节,手动微笑. 这么下去还怎么混...赶紧复习个... 三次握手是什么? TCP是面向连接的,无论哪一方向另一方发送数据之前,都必须先在双 ...
- TCP三次握手的过程
三次握手 下图就是wireshark抓包工具抓获的TCP连接建立的三次握手过程: http://www.cnblogs.com/hnrainll/archive/2011/10/14/2212415. ...
- TCP三次握手那些事
临近5月,春招和实习招聘逐渐进入尾声.本文主要讨论面试中经常提问的TCP连接的机制,附带一些扩展知识. 参加面试的时候,过半的面试官都会问TCP相关问题,而最常见的问题就是:讲一下TCP三次握手(四次 ...
- 脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手
.引言 网络编程中TCP协议的三次握手和四次挥手的问题,在面试中是最为常见的知识点之一.很多读者都知道“三次”和“四次”,但是如果问深入一点,他们往往都无法作出准确回答. 本篇文章尝试使用动画图片的方 ...
- [转帖]脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手
脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手 http://www.52im.net/thread-1729-1-1.html 1.引言 网络编程中TCP协议的三次握手和 ...
随机推荐
- 使用DockerCompose部署微服务项目(基于Springboot搭建一个简易计数器)
准备Dockerfile FROM java:8 #基于jdk8的环境 COPY *.jar /app.jar #拷贝所有的jar包到/app.jar目录下 CMD ["--server.p ...
- 第17章 使用日志记录监视和排除错误(ASP.NET Core in Action, 2nd Edition)
第3部分 扩展应用程序 我们在第1部分和第2部分中介绍了大量内容:我们查看了您将用于构建传统服务器渲染的 Razor Pages 应用程序以及 Web API 的所有主要功能组件.在第3部分中,我们将 ...
- 2003031118—李伟—Python数据分析第七周作业—MySQL的安装以及使用
项目 MySQL的安装以及使用 课程班级博客链接 20级数据班(本) 这个作业要求链接 作业要求 博客名称 2003031118-李伟-Python数据分析第七周作业-MySQL的安装以及使用 ...
- 了解JAVA基本知识以及一下常用的dos命令
9月5日学习 常用的Dos命令 #盘符切换盘符名称: =>回车#查看当前目录下的所有文件dir#切换目录 cd change directorycd .. =>返回上一级目录#清理屏 ...
- HashMap中的Entry接口
利用Entry接口,快速又方便 import java.util.HashMap; import java.util.Map; public class MapDemo { public static ...
- RKO组——冲刺随笔(3)
这个作业属于哪个课程 至诚软工实践F班 这个作业要求在哪里 第五次团队作业:项目冲刺 这个作业的目标 记录冲刺计划.要求包括当天会议照片.会议内容以及项目燃尽图(项目进度) 1.昨日进展 对上一次讨论 ...
- FtpClient上传文件异常:java.net.SocketException: Connection reset
FtpClient上传文件异常:java.net.SocketException: Connection reset 这问题折磨我快一天了,下午这会儿终于解决了,问题不在程序错误,原因还是出在上传图片 ...
- MySQL日期date型和int型互换的方法
一.date型换int型 SELECT UNIX_TIMESTAMP('2017-9-22 13:54:45') 二.int型转date型 SELECT FROM_UNIXTIME(150605968 ...
- 【Access】清空数据并重置自增主键
DELETE FROM tasks ALTER TABLE tasks ALTER COLUMN id COUNTER(1,1)
- 功能测试--Fiddler
Fiddler(更推荐Charles,很好用) 1.fiddler是什么?------客户端的所有请求都要先经过fiddler,然后转发到服务器:反之,服务器的所有响应,也会先经过fiddler,然后 ...