《深入分析 javaweb 技术内幕》P38 读书扩展

作者:淮左白衣

写于2018年4月12日20:58:36

目录


听了刘德华的《17岁》,华仔在中间喊话:还记不记得我17岁的时候你们多少岁啊?是不是和我一样都是17岁啊?亦是当时只是小孩子啊?莫名哀伤时间流逝
17岁的华仔,那时刚出道!想想我的17岁,青春既没开花,也没喂狗,只是平淡的流走了!没有人永远17岁,但是永远有人17岁!

TCP状态转换图解

TCP的一次通信,分为建立连接(三次握手)、关闭连接(四次挥手);


图解三次握手

实线代表服务器 的状态转换、虚线代表客户端 的转态转换;

文字讲解三次握手:

  1. 最开始客户端和服务器,都处于 CLOSED 状态,二者之间没有任何联系;
  2. 客户端向服务器发起连接请求,具体操作是发送一个 SYN 给服务器,客户端状态转而变为 SYN-SENT ,这是第一次握手
  3. 由于客户端向服务器发送请求了,服务器被动的进入 LISTEN 状态;
  4. 如果服务器没有想要客户端的请求,则客户端得不到服务器的回应,请求就会超时,一旦请求超时,客户端的状态,就会再次进入 CLOSED
  5. 如果服务器响应了这个请求,具体操作是:接收到了客户端发送的 SYN,同时向客户端发送回应 SYN+ACK,表示我收到你的请求了;然后服务器的状态,进入 SYN-RECEIVED ; 这是第二次握手
  6. 客户端收到服务器的回应 SYN+ACK,然后再次向服务器发送一个 ACK,表示我收到你的回应了 ;客户端的状态进入 ESTABLISHED这是第三次握手
  7. 服务器收到客户端的响应 ACK 以后,状态进入 ESTABLISHED
  8. 至此,三次握手完成,客户端与服务器建立了可靠的连接,可以进行数据传输了 ;

上面有个特殊的地方:

假如客户端发送请求报文SYN的时候,服务器也发送了请求报文SYN ,则客户端进入 SYN-RECEIVED 状态,角色变为服务器; 一般这种情况是,没有绝对的客户端、服务器;通信的两台机器,可以在客户端和服务器之间进行角色的切换 ;


图解四次挥手

实线代表主动关闭方 的状态转换、虚线代表被动关闭方 的转态转换;

文字讲解四次挥手:

  1. 主动关闭方,发送 FIN 给被动关闭方,然后进入 FIN-WAIT-1 状态 ;
  2. 被动关闭方,收到主动关闭方的 FIN,会送一个回应 ACK 给主动发送方,然后进入 CLOSE-WAIT
  3. 主动方收到被动方回应的ACK,并且也回应一个ACK,然后进入 FIN-WAIT-2 ;
  4. 既然主动方要关闭连接,那么被动方也不能死皮赖脸的不关啊,它也就向主动方发送一个请求FIN,然后进入 LAST-ACK
  5. 被动方收到主动方的回应ACK,进入 CLOSED
  6. 主动方收到被动方发送的 FIN 之后,发送回应 ACK(主动方在接收到被动方发送的FIN,将不再接受任何信息,但是可以发送信息),进入 TIME-WAIT

    上面是有一方先于对方,发起关闭请求 ,下面说下,双方同时发起关闭请求的情况;

    当双方同时发起关闭请求的时候,双方在发送完FIN 以后,都进入 FIN-WAIT-1 状态;然后如果双发又同时收到对方的FIN,以及同时收到对方回应的ACK,则直接进入 TIME-WAIT

    如果双方同时收到FIN,但是没有同时收到ACK,则先进入 CLOSING,然后,在双方都收到 ACK 以后,再进入 TIME-WAIT ;

为什么在进入 TIME-WAIT 的状态以后,会等待 2MSL 的时间,再进入 CLOSED

MSL 翻译为:报文最大生存时间 ;,2MSL则是两个报文最大生存世时间,等待这个时间的原因:是因为在网络不好的时候,有时候,需要重新发送报文,因此进入这里的等待下 ;

TCP状态转换(图解+文字解说)的更多相关文章

  1. TCP状态转换

    最近笔试遇到一个题目:如果tcp建立连接时第三次握手失败,tcp会做何操作?该问题的本质是判断我们对tcp的状态转换是否能有比较深刻的理解.只要理解了下面的状态转换图,很容易回答上述问题. 在此,将& ...

  2. 《UNP》学习之TCP状态转换

    CLOSED:TCP起始状态 LISTEN:绑定端口后进入listen状态,一般是服务端 SYN_SENT:发送SYN连接请求,主动打开连接的一方进入SYN_SENT SYN_RCVD:接收到SYN连 ...

  3. TCP 连接建立和断开,以及状态转换

    1. TCP报文结构 TCP是一种可靠.面向连接.全双工的传输层协议,其报文格式如下所示:      源端口.目的端口:16位长.标识出远端和本地的端口号.     顺序号:32位长.表明了发送的数据 ...

  4. TCP的状态转换

    TCP的状态转换图 手写的状态转换图 一.服务端状态变迁:​ 服务端创建套接字之后调用listen函数将套接字有一个未连接的主动套接字转换为被动套接字,指示内核应接受指向该套接字的连接请求,套接字状态 ...

  5. java 22 - 18 多线程之 线程的状态转换、线程组

    线程的状态转换图解:图片 线程的线程组: 线程组: 把多个线程组合到一起.    它可以对一批线程进行分类管理,Java允许程序直接对线程组进行控制. 首先创建一个Runnable的实现类 publi ...

  6. 传输控制协议(TCP) -- TCP状态转换图

    TCP状态转换图 在<UNIX网络编程 卷1>一书中,作者给出了TCP状态转换图(如下).本文也将围绕此图进行阐释. 注:上图红框表示比较特殊的地方. TCP状态转换两条主线 图2-4中的 ...

  7. TCP状态转换图解析

    本文参考Unix网络编程卷1,对TCP状态转换进行总结,方便掌握TCP链接中各个状态及故障分析. 1.Linux下TCP相关工具 基于Linux系统查看网络状态,首先了解几个基本查看指令. Linux ...

  8. TCP状态知识总结(图解)

    tcp状态:   LISTEN:侦听来自远方的TCP端口的连接请求 SYN-SENT:再发送连接请求后等待匹配的连接请求 SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认 ...

  9. TCP连接建立与终止,及状态转换

    TCP连接建立 三路握手 三路握手发生在客户端发起connect请求到服务端accept返回中,在三路握手发生前,服务端必须准备好接受外来连接,这通常通过服务端调用 (socket.bind.list ...

随机推荐

  1. codeforces425C

    http://codeforces.com/contest/425/problem/C 题意:两数列a[],b[],进行若干轮操作,每次操作花费e, 将a的一个前缀和b的一个前缀(两前缀的最后一个数字 ...

  2. 将Excel文件导入到Navicat Premium中日期变为0000-00-00

    在网上查询了一些文章,说要改excel的单元格格式,我试验了好几次,不管是设置成文本,还是日期,都始终是 0000-00-00. 最后改变了办法,把数据库中的date类型设置 成 varchar,等导 ...

  3. mysql全面优化

    在进行MySQL的优化之前,必须要了解的就是MySQL的查询过程,很多查询优化工作实际上就是遵循一些原则,让MySQL的优化器能够按照预想的合理方式运行而已. 图-MySQL查询过程 一.优化的哲学 ...

  4. 手写实现RPC框架(不带注册中心和带注册中心两种)

    实现自己的RPC框架如果不需要自定义协议的话那就要基于Socket+序列化. ProcessorHandler:主要是用来处理客户端的请求. package dgb.nospring.myrpc; i ...

  5. [游戏开发]LÖVE2D(1):引擎介绍

    什么是LÖVE引擎 Love引擎是一个非常棒的框架,你可以用来在Lua制作2D游戏.它是免费的,开源的,适用于Windows,Mac OS X,Linux,Android和iOS. 怎么安装 在官网下 ...

  6. WhereHows编译时报错EINVRES Request to https://bower.herokuapp.com/packages/ace-builds failed with 502

    先说明一下,简单点讲就是bower的仓库地址换掉了.解决方案如下: 在.bowerrc文件中增加这么一句: { "registry": "https://registry ...

  7. vlookup实战_英语单词更新

    https://study.163.com/provider/400000000398149/index.htm?share=2&shareId=400000000398149( 欢迎关注博主 ...

  8. vue项目中 favicon.ico不能正确显示的问题

    方法一:修改index.html文件 <link rel="shortcut icon" type="image/x-icon" href="f ...

  9. SQL-W3School-函数:SQL ROUND() 函数

    ylbtech-SQL-W3School-函数:SQL ROUND() 函数 1.返回顶部 1. ROUND() 函数 ROUND 函数用于把数值字段舍入为指定的小数位数. SQL ROUND() 语 ...

  10. [原][OSG][osgEarth]osgEarth例子程序简介

    1.osgearth_graticule:生成经纬线. 2.osgearth_annotation:各类标注(点.线.面.模型.文本等). 3.osgearth_city:加载一个城市三维模型,可以浏 ...