[转载]《一个陌生女人的来信》借名著说一些网络基础知识

Scroll Down

image.png

前言

最近复习网络的知识,很多抽象的知识不由自主联想想到自己看过的一些小说。自己也脑补了一些情节。

于是用这种方式梳理了一些网络中基础而重要的知识。希望给正在看文章的你带来一丝启发

第一节:儿子送信-认识五层网络模型

这里用故事将五层网络模型形象化,您可以抓重点直接看精华部分——第六点数据传输的本质或者从后面章节开始🤞

1.应用层

故事从女主给作家写信送信开始了。

陌生女人想给作家写信,陌生女人就相当于是浏览器,作家就是服务器上的程序。这些层序就属于应用层。

应用层的主要作用是为用户的应用进程提供服务

陌生女人(简称女主) —浏览器
作家 — 服务器上的程序
信件—传输的数据

HTTP协议

女主比较羞涩,于是叫自己的儿子帮忙去送信,可怜的儿子出生后就没见过自己的父亲,陌生女人母亲担心儿子送错了人,于是向女主的儿子和作家之间约定了一个暗号。这个暗号就是我们所说的http协议。

http协议是应用层之间的协议之一,规定了上述例子中传信过程中通信和交互的规则。应用层上的协议有很多,DNS域名解析协议,FTP文件传输协议等等,不同的协议对应着不同的网络应用。
有了这个暗号信就不会送错啦,就像前段时间疫情影响,回家小区门口还要对个暗号,比如:
image.png

儿子问:朱自清《春》第二段第一句 作家答:一切都像刚睡醒的样子 如果儿子把信不小心送给了一个画家,画家可能觉得这孩子。。。背书背傻了吧。

2.传输层

传输层为两台主机上的进程提供数据传输的服务。(大家都知道服务器可看成一台计算机吧)

如果没有传输层的服务那么陌女想给作家传信也无法传递,就像高铁不给我售票我想回家也回不去。

端口号

说道进程之间的通信,这里引入端口号的概念。先捋一捋端口号是什么。

每一个房子相当于连接到连接到网络中的一台计算机。
每个房子里有很多个房间,房间相当于连接到网络中的计算机上的一个应用程序。
根据门牌号找到不同的房间,门牌号类比于端口号,根据不同的端口号找不同的应用程序。
引用一段官方解释:

端口号的主要作用是表示一台计算机中的特定进程所提供的服务。网络中的计算机是通过IP地址来代表其身份的,它只能表示某台特定的计算机,但是一台计算机上可以同时提供很多个服务,如数据库服务、FTP服务、Web服务等,我们就通过端口号来区别相同计算机所提供的这些不同的服务,如常见的端口号21表示的是FTP服务
现在应该知道端口号是啥了吧。接着讲讲复用和分用.

由于一个主机可同时运行多个进程(进程可以理解为每个应用程序,浏览器就是一个应用程序可看作进程),因此运输层有复用和分用的功能。

可能你还不明白复用和分用,那下面就对复用和分用进一步说明。

复用:多个应用层的进程可以同时使用传输层的服务
比如在女主(浏览器)向作家(服务器上程序)送信的过程中。这个时候微信也在访问服务器上相应的程序那么也会使用传输层。
分用:分用和复用相反,是把传输层的东西分开传送到上面的应用层。
ok,那传输层有哪些协议呢

传输层的协议

这个时候女主儿子要去送信了,这个时候陌女通常有两个选择。

可以选择做其他的事情,在家等儿子带着信息回来,如果儿子把信弄丢了啥的没有送到作家手里都不管,心大型比较佛系的哈
然后还有一种就是焦急的等待着,等待着…等待着儿子的回信,如果儿子半路上把信弄丢了赶紧再写一封送过去重头开始。
上述的两种方法对应着传输层的两种协议
UDP用户数据报协议(User Datagram Protocol)
提供无连接的,尽最大努力的数据传输服务(不保证数据传输的可靠性)。- 在送信途中如果把信弄丢了在网络中称之为丢包
TCP 传输控制协议(Transmission Control Protocol)
面向连接的,数据传数单位是报文段(segment),能够提供可靠的交付。
UDP/TCP两者区别

  • TCP是一个面向连接的、可靠的、基于字节流的传输层协议。
  • 而UDP是一个面向无连接的传输层协议。

类型 特点1 特点2 特点3 性能 1 性能2 应用场景 举例
—– 是否面向连接 传输可靠性 传输形式 传输效率 所需资源
tcp 面向连接 可靠 字节流 慢 多 要求通信数据可靠 QQ微信通话
udp 无连接 不可靠 数据报文段 快 少 要求通信速度高 文件传输、接收邮件

3.网络层(IP层)

儿子拿到信后准备送信了,送信要知道路怎么走,要知道路怎么走就得知道目的地的地址呀,当然在传输层的时候就已经知道作家的地址了。

在网络层中要找到一条合适的路。

陌女的地址(出发地 紫薇园四栋三单元201室)作家的地址(目的地 葵花园三栋三单元502室)。

儿子在某地图中输入出发地,目的地,就找到了一条给爸爸送信的路。

网络层形象化

计算机世界的交通网络可以类比我们生活中的交通网络,错综复杂。计算机中网络的世界就是我们平时说的网络层。

网络层为不同的主机提供服务在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组或包进行传送。

负责为分组交换网上的不同主机提供通信服务;选择合适的路由,使源主机运输层所传下来的分组,能够通过网络中的路由器找到目的主机。
注意传输层是为主机上的进程,网络层是为主机提供服务。

IP地址和IP协议

IP地址:IP地址就是给每个连接在互联网上的主机分配的一个32位地址。
IP地址 = 网络地址 + 主机地址 或IP地址 = 网络地址 + 子网地址 + 主机地址
IP地址只能找到网络中的某台主机,无法准确定位到主机中的应用程序。
IP(网际互连协议)协议:是TCP/IP体系中的网络层协议。协议可以理解成一些规定规则,那么跟IP地址完全不是一个概念了嘛在网络中通常使用IP地址+端口号来定位一个程序在计算机中的位置,这种方式就是一种IP协议。
这个时候,儿子在运输层拿到了作家的地址了,网路层找到了最好路线,要准备出发了。

别急,接下来是数据链路层‍

4.数据链路层

为什么有数据链路层

两台主机之间的数据传输,总是在一段一段的链路上传送的。

数据链路层定义了在单个链路上如何传输数据。

紫薇园四栋三单元201室 ————> 南京路 ————> 万达广场 ————>葵花园三栋三单元502室这是送信的路径,紫薇园四栋三单元201室 ————> 南京路就像是1个链路。

数据链路层的任务

数据链路层将网络层交下来的 IP 数据报组装成帧,在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息(如同步信息,地址信息,差错控制等)。
数据链路层主要有两个功能 :帧编码和误差纠正控制。
数据链路层协议又被分为两个子层 :逻辑链路控制(LLC)协议和媒体访问控制(MAC)协议。
逻辑链路控制(LLC)协议:好比在地图中看到的路线图,虚拟的。
媒体访问控制(MAC)协议:现实世界中中存在的路线图,真实的。这个时候儿子根据路线图在走着呢,走着看到一个马车就上了车。

5.物理层

物理层负责的是透明的比特流传输确保原始的数据可在各种物理媒体上传输。

over,五层模型就差不多介绍完了,下面回顾一下。

应用层:规定了开门的暗号。http协议
运输层:找到了准确地址。TCP/UDP协议
网络层:找到一条合适的路。IP协议
数据链路层:坐着马车出发了。MAC/LLc协议
物理层:到达作家附近,下车。一些协议
当信送到物理层后还是没有到达作家的手里,作家此时是在应用层的。而信还在服务器网络的物理层,所以又是一个从物理层到应用层的过程。

物理层->数据链路层->网络层->运输层->应用层

6.数据传输的本质

讲故事是为了便于生动理解整个过程,但是为了防止大家陷入故事情节无法自拔。我想说一下数据在五层网络结构中传输的本质。

数据在网络的每层结构中传输,共同的目的都是把数据从主机A传到主机B。但是这个数据不是直接传输的。这个数据在主机A的网络中会经过五层结构的封装送到了主机B的网络,送过去的是包装好的数据,想要拿到数据就会再经过五层结构的解封拿到真正想要的数据。
image.png

引用一下《图解HTTP》中的图:

再来个栗子~

假如你网上买了个100万的青花瓷瓶,快递公司要把它寄过来。这么贵重的易碎品是不是要包好几层泡沫啥的,假如包了五层。这样一层接着一层小心翼翼的包好后发货。过了一段时间收到货了你想要的是青花瓷,又小心翼翼的拆开五层包装最后拿到了青花瓷。

每层协议的本质就是在数据外面套一层层特殊的数据,在数据送到的时候将一层层协议拆开拿到想要的数据

7.其他计算机网络体系结构

image.png

计算机网络体系结构有三种:OSI七层体系结构、TCP/IP体系结构和上面的五层体系结构。五层体系结构是前两者的融合

七层结构将应用层分为三层:应用层表示层和会话层,表示层和会话层没有相应的协议,一般表示层做数据格式化或者加密等操作。

第二节:前往千度-域名解析的过程

DNS域名解析协议是应用层的协议,主要将域名解析成IP地址。我们接着上一篇的送信来讲今天的故事。

话说儿子送到了信,作家很惊讶,自己什么时候留下了一颗小种子,还发芽了???待儿子向作家说明了一切,作家想起了陌生女人,并且约她去千度参加一个舞会,七点在千度等她。

陌生女人心想:呜呜呜,渣男,竟然不来接我,但是她还是决定先去千度参加舞会。

这里的千度就是网络中的域名。每个域名都对应这一个IP地址。IP地址就是一个32位的表示主机的地址。比如168.0.0.1。

域名和IP地址都表示某个主机,他们可以说是一个东西也可以说不一样。域名是便于用户使用(作家不会说我在169.0.0.1等你),IP地址是便于计算机使用。

以上就是域名解析的过程。先在本机缓存和hosts文件中寻找,再到本地域名解析服务器寻找,最后到通用顶级域服务器寻找。如果中途找到了对应的IP就停止向下查找。

域名劫持:这里补充一个知识点域名劫持。前面说在windows中可通过c盘里一个叫hosts的文件来设置,如果你在这里指定了一个域名对应的ip地址,那浏览器会首先使用这个ip地址。

但是这种操作系统级别的域名解析规程也被很多黑客利用,通过修改你的hosts文件里的内容把特定的域名解析到他指定的ip地址上,造成所谓的域名劫持

就想象某人嫉妒女主不想让她与作家见面就故意修改了她的地图小本本误导女主去了其他的地方。

第三节:约会必备-TCP报文格式

女主听说舞会上喜欢TCP的三次握手方式交朋友,这样比较严谨。emmm于是女主决定去学习一下这种打招呼的方式,毕竟在舞会上那么多人呢,女主就从认识TCP报文格式开始啦。

(原谅我这一节着实不知道怎么编故事)

直接上图吧!LINGLONG觉得六个标志位和特殊的ack确认号,seq序列号是一定要知道的。
image.png

source port/destination port:表示源端口、目的端口。源端口标识报文的返回地址,目的端口表示接收方计算机上应用程序接口。
唯一确定一条TCP连接:源端口+目的端口+源IP地址+目的IP地址
Sequence Number/Acknoledgment:序列号seq/确认号ack。
在TCP传送的流中,每一个字节一个序号。比如一个报文段的序号为300,此报文段数据部分共有100字节,则下一个报文段的序号为400。所以序号确保了TCP传输的有序性。
确认号指明下一个期待收到的字节序号,表明该序号之前的所有数据已经正确无误的收到。确认号只有当ACK标志为1时才有效。比如建立连接时,SYN报文的ACK标志位为0。
注意ACK是一个标志位(非0即1)与确认号ack不同。
Data-Offset:数据偏移,也叫首部长度。
Reserved:保留。为将来定义新的用途保留,现在一般置0
六个标志位

  • URG:紧急指针标志,为1时表示紧急指针有效,为0则忽略紧急指针。
  • ACK:确认序号标志,为1时表示确认号有效,为0表示报文中不含确认信息,忽略确认号字段。与前面的确认号息息相关但两者不是一个东西
  • PSH:push标志,为1表示是带有push标志的数据,指示接收方在接收到该报文段以后,应尽快将这个报文段交给应用程序,而不是在缓冲区排队。
  • RST:重置连接标志,用于重置由于主机崩溃或其他原因而出现错误的连接。或者用于拒绝非法的报文段和拒绝连接请求。
  • SYN:同步序号,用于建立连接过程,在连接请求中,SYN=1和ACK=0表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认,即SYN=1和ACK=1。
  • FIN:finish标志,用于释放连接,为1时表示发送方已经没有数据发送了,即关闭本方数据流。

Window窗口:滑动窗口大小,用来告知发送端接受端的缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。窗口大小时一个16bit字段,因而窗口大小最大为65535。
check sum校验和:奇偶校验,此校验和是对整个的 TCP 报文段,包括 TCP 头部和 TCP 数据,以 16 位字进行计算所得。由发送端计算和存储,并由接收端进行验证。
urgent pointer紧急指针:只有当 URG 标志置 1 时紧急指针才有效。紧急指针是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号。TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式。
opptions/padding选项和填充:最常见的可选字段是最长报文大小,又称为MSS(Maximum Segment Size),每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志为1的那个段)中指明这个选项,它表示本端所能接受的最大报文段的长度。选项长度不一定是32位的整数倍,所以要加填充位,即在这个字段中加入额外的零,以保证TCP头是32的整数倍。
data数据部分:TCP 报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。
说明:这里的内容参考了TCP报文格式详解

第四节:千度相遇-TCP三次握手

话说第二回女主经过域名解析后找到了千度的IP地址168.0.0.1,也学会了TCP握手的基本要领。于是准备前往千度去寻找她心爱的作家。

1.三次握手解析

TCP是一个可靠的,面向连接的字节流的传输层协议。

为什么有三次握手

面向连接意味着两个使用 TCP 的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个 TCP 连接,这个连接就是三次握手。在一个 TCP 连接中,仅有两方进行彼此通信。

因此网络中三次握手是为了确定两台主机之间具有收和发的能力,如果一方有问题信息就不会发送。女主和作家之间的三次握手是为了鉴别自己能否认出对方和被认出。

同时也说明了UDP为什么没有握手。

三次握手过程

假如服务器是作家,客户端是女主。

第一次握手

女主在马路对面看到了作家后,欣喜若狂。但是不确定是不是,于是先向作家挥挥手.

在网络中第一次握手也是一个使用TCP的程序向另外一个使用TCP协议的程序打招呼,通常是客户端向服务器打招呼。

客户端打招呼过程中传递了两个信息:请求建立(SYN=1)和发出一个序列号(seq=n),假设这里的n是200.

作用:服务器B知道了客户端A可以发消息。作家知道女主认出了自己。

第二次握手

作家看到女主挥手后,点点头(syn、ack),然后向女主挥挥手(seq)。

在网络中第二次握手服务器传递了三个信息:分别是同意建立连接(SYN=1),确认收到了刚才的信息(ack=刚才seq+1即ack=201),发出自己的序列号(seq=x,x也是一个数,假如是99)

作用:客户端(A)收到服务端(B)的信息后B可以接收消息和发送消息。女主知道作家看到了我的挥手,认出了我。

第三次握手

女主向作家点头。

网络中第三次握手客户端向服务器发消息,这个消息也传递了三个信息:第一个是现在开始发送(syn=0),第二个是成功收到了服务器的信息(ack=seq+1即99+1,ack=100),第三个是发出这次的序列号(seq=最开始发出的序列号200+1=201)

作用:B知道A可以接收信息。作家知道女主看到了我的挥手。

上述三个过程就是互相试探确认的过程,再复习一下TCP报文格式中ack、seq、syn。

ack:确认号,非标志位。指明下一个期待收到的字节序号,ACK标志为1才有效。
seq:序列号,非标志位。表示了传输序列的有序性
syn:同步序号标志,标志位。用来发起一个连接。SYN=1表示这是一个连接请求或连接接受请求。
ACK:确认序列号标志,标志位。非0即1,1表示确认号有效。
下面看看这张图理解一下状态变化。

在第二次握手和第三次握手还会出现一个ACK=1的信息,它是确认序号有效标识。只有当ACK=1时确认号字段ack才有效。当ACK=0时,确认号ack无效。
image.png

初始0:客户端closed关闭,服务器listen监听某个端口(其实最开始服务端也是closed状态)。
状态1:第一次握手,客户端向服务端发送一个序列号syn,客户端变成syn-send.
状态2:第二个握手,服务端收到客户端的信息并作出回应,服务端变为syn-revd状态
状态3:客户端收到第二次握手的信息后再告诉服务器自己收到了此时客户端是establish状态。
状态4:服务器收到客户端第三次握手的信息后也变成了establish状态。双方建立了连接。

2.为啥不是两次或者四次握手

首先,握手是为了让服务器和客户端之间建立连接,确认双发都具有发送信息和接收信息的能力。如果是两次握手那么服务器就不能确定客户端能否接收到自己发送的信息。so,两次握手是不可以的。
另外两次握手的话会出现一些资源浪费的问题,比如说客户端已经向服务端发送了一个信息但是服务器迟迟没有收到,客户端就会重传,此时服务器收到后进行第二次握手,成功握手后就开始数据传输,传输结束后断开连接。
然后这个时候先前没有收到的包又到达了服务器,服务器就会向客户端发送数据包建立连接,但是此时是断开的客户端无法做出响应。服务器却一直等待客户端的响应,这就是资源浪费。
最后,四次握手也是可以的,但是我们三次握手的时候就确认了双方能够进行交流,不必多此一举。

3.知道SYN泛洪攻击吗&如何应对?

SYN同步序号标志,用来发起一个连接,也就是在发起连接的时候进行攻击。

SYN 攻击是一种典型的 DoS/DDoS攻击。就是客户端在短时间内伪造大量不存在的IP地址,并向服务器不断地发送SYN包,Server则回复确认包,并等待Client确认。会引发下面两个问题最后导致网络拥塞甚至是系统瘫痪。

第一次握手结束,服务器收到大量的SYN包并回复确认包,状态变为syn-revd后连接放入半连接队列,队列中正常的连接因为队列满被丢弃无法处理。
IP地址是不存在的,服务器长时间没办法得到客户端的确认因此不断向客户端重发,直至超时。
如何应对 SYN 泛洪 攻击?

增加 SYN 连接,也就是增大半连接队列的容量。
减少 SYN + ACK 重试次数,避免大量的超时重发。
利用 SYN Cookie 技术,在服务端接收到SYN后不立即分配连接资源,而是根据这个SYN计算出一个Cookie,连同第二次握手回复给客户端,在客户端回复ACK的时候带上这个Cookie值,服务端验证 Cookie 合法之后才分配连接资源。

4.那什么是半连接队列和全连接队列

首先要知道在服务器有closed状态变为listen状态的时候生成了两个空队列—-半连接队列和全连接队列。

半连接队列:入半连接队列发生在服务器的syn-revd状态。当客户端发送SYN到服务端,服务端收到以后回复ACK和SYN,状态由LISTEN变为SYN_RCVD,此时这个连接就被推入半连接队列。
全连接队列:入队列发生在三从握手结束后服务器的establish状态。当客户端返回ACK, 服务端接收后,三次握手完成。这个时候连接等待被具体的应用取走,在被取走之前,它会被推入另外一个 TCP 维护的队列,也就是全连接队列。

5.ISN(Initial Sequence Number)是固定的吗?

INS(Initial SequenceNumber初始序列号),客户端发送一个SYN标志位置1的包指明客户打算连接的服务器的端口,以及初始序号X,保存在包头的序列号(Seq)字段里。

三次握手的其中一个重要功能是客户端和服务端交换 ISN(Initial Sequence Number),以便让对方知道接下来接收数据的时候如何按序列号组装数据。如果 ISN 是固定的,攻击者很容易猜出后续的确认号,因此 ISN 是动态生成的。

6.三次握手过程中可以携带数据吗?

第三次握手可以携带数据,其他是不行的。

为什么第三次可以携带数据,因为第三次握手是客户端向服务器发送数据,此时的客户端已经知道服务器可以接收和发送数据,相对安全。

为什么第一次不行?假如第一次可以发送数据,攻击者疯狂王第一次握手的数据包发送数据,那么服务器就会花大量的时间和空间来处理这些数据。攻击者根本就不理服务器的接收、发送能力是否正常,服务器就要哭了!

同样的道理,如果第二次握手疯狂向客户端发送数据,客户端的接收发送能力是否正常还没有确定,客户端要哭了。

In a word,第一次和第二次握手如果能够发送就会增加被攻击的风险。

7.如果第三次握手丢失了,客户端服务端会如何处理(有意思)?

这个问题要注意是第三次握手丢失还是第三次握手失败。

第三次握手丢失:当客户端收到服务端的SYN+ACK应答后,其状态变为ESTABLISHED,并会发送ACK包给服务端,准备发送数据了。如果此时ACK在网络中丢失,过了超时计时器后,那么Server端会重新发送SYN+ACK包,重传次数根据/proc/sys/net/ipv4/tcp_synack_retries来指定,默认是5次。如果重传指定次数到了后,仍然未收到ACK应答,那么一段时间后,Server自动关闭这个连接。但是Client认为这个连接已经建立,如果Client端向Server写数据,Server端将以RST包响应,方能感知到Server的错误。
当第三次握手失败时:服务器并不会重传ack报文,而是直接发送RST报文段,进入CLOSED状态。这样做的目的是为了防止SYN洪泛攻击。
这里参考牛客网-格子灰的解答

第五节:再次分别-TCP四次挥手

女主和作家约会结束后他们也要分开了,在小说中作家和女主那啥后,留下一沓钱就离开了。。。。不得不说作家是个十足渣男呐

作家:我要回去了,转了笔钱你(FIN)
女主:我知道了(ack)(知道了)
女主:钱收到了(FIN)(接收完了)
作家:再见(ack)。作家等待2msl后见女主没有反应消失在人海中(close)。
他们经历了四次挥手,又回到了原来的样子。下面讲网络中四次挥手的过程。

1.四次挥手过程

三次握手成功后进行TCP之间数据传输,数据传输结束会进行四次挥手。这由TCP的半关闭(half-close)造成的。所谓的半关闭,就是结束自己的发送功能后还能接收来自另一端数据的功能。

第一次挥手:客户端告诉服务器数据发完了。客户端向服务器发送FIN报文。
发出连接释放报文段(FIN=1,序号seq=p),
并停止再发送数据,主动关闭TCP连接,
进入FIN_WAIT1(终止等待1)状态,等待服务端的确认。
第二次挥手:服务器知道客户端数据发完了。服务器向客户端发送ack报文。
服务端收到连接释放报文段后即发出确认报文段(ACK=1,确认号ack=p+1,序号seq=q),
服务端进入CLOSE_WAIT(关闭等待)状态,此时的TCP处于半关闭状态,客户端到服务端的连接释放。
客户端收到服务端的确认后,进入FIN_WAIT2(终止等待2)状态,等待服务端发出的连接释放报文段。
第三次挥手:服务器告诉客户端数据接收完了。
服务端没有要向客户端发出的数据,服务端发出连接释放报文段(FIN=1,ACK=1,序号seq=w,确认号ack=p+1)
服务端进入LAST_ACK(最后确认)状态,等待客户端的确认。客户端发完了数据但是不确定服务器有没有接收成功,所以客户端收到服务器接收完毕的反馈后才会真正的断开连接。
第四次挥手:客户端知道服务器接收完了。
即客户端收到服务端的连接释放报文段后,对此发出确认报文段(ACK=1,seq=p+1,ack=w+1),客户端进入TIME_WAIT(时间等待)状态。
此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL后,客户端才进入CLOSED状态。
下图是客户端和服务器建立连接到释放连接的过程。

2.为什么握手三次挥手四次

其实前面也说过是因为TCP的半关闭造成的,与客户端发数据的功能丢失后还能接收数据有关。

当第一次挥手完成服务器知道客户端向自己发送了fin报文后后,因为此时可能还有数据要发往客户端故不能立即响应fin报文。服务器先发送一个ack表示确认收到,过一段时间等自己的数据发送完了,再向客户端发送fin报文。

3.说一说四次挥手释放连接时的2MSL,以及为什么等待是2MSL

首先,2 个 MSL(Maximum Segment Lifetime,报文最大生存时间)的等待时间是为了确保客户端发出的第四次挥手的ACK报文成功的发送到了服务器端。如果没有成功到达,客户端会收到一个重发请求,处于time_wait状态的套接字会立即向对方重发ACK报文,如果成功到达挥手结束。

另外也保证了在关闭连接后不会有还在网络中滞留的报文段去骚扰服务器。

最后,为什么要等待2MSL。原因如下:

如果最后一个ACK包丢了,检测到丢包时用了一个MSL,这时主动关闭端就关闭了,对方请求重发的时候,主动关闭端就接收不到了,就会出现死循环。

也就是说第一个MSL检测第四次握手的ACK是否丢包了。第二个MSL是假如ACK丢包了,这个时候客户端还没有关闭,能够进行重传ACK;如果第一个MSL结束后客户端进入close状态就不会重传ACK。

这下明白为什么不是等待一个报文最大生成时间了吧。

最后

掘金社区很多不错的文章,用心阅读,用心总结,然后用自己喜欢的方式来理解感觉还是蛮不错滴

参考文章:

计算机网络基础知识 – 五层协议的体系结构
四次挥手为什么要等2个MSL,而不是1个MSL
神三元——(建议收藏)TCP协议灵魂之问,巩固你的网路底层基础
小说介绍

为了更好理解网络,我用小说的男女主来举例子对原文做了一些篡改,这里LINGLONG怀着一颗尊重小说的心,用两句话介绍一下《一个陌生女人的来信》这本书。

作品讲述的是一,在她生命的最后时刻,给作家写了一封长长的信,讲述了自己从小头片子开始和作家之间的凄美爱情故事。虽然作家曾两次和女主约会并且还有一个儿子。。。但是作家不记得了。。。小儿子还死掉了。。。

当作家他看到女主的信虽然有些触动但是仍然没有想起女孩,就当作家脸盲吧。

总之这是漂亮女孩和一个满腹经纶的作家之间,求而不得暗恋一生的凄美爱情故事。

感谢阅读

上面是一些计网的基础知识,希望对你有一些思考和启发。

如果可以,下一篇围绕狄更斯的《雾都孤儿》写一点算法知识