• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

计算机网络—TCP知识点一

武飞扬头像
o今晚打老虎o
帮助1

目录

0 引言

1 什么是传输层?

2 传输层协议

3 TCP连接的建立

4 为什么是TCP三次握手

4.1 为什么不是四次握手

4.2 为什么不是两次握手

5 TCP四次挥手

5.1 为什么是四次挥手?

6 TIME_WAIT状态

6.1 TIME_WAIT状态为何设置为2MSL

6.2 TIME_WAIT状态的作用


0 引言

文章主要对TCP相关的知识点进行了总结,文中的图片均来自小林Coding《图解网络》小林coding

1 什么是传输层?

传输层位于应用层的下层,为应用程序提供端到端的逻辑通信。传输层有两个非常重要的作用——复用和分用。复用的意思是在应用层的角度来看,我们不同的应用程序都能够被封装成一定格式的传输层报文后进行传输;分用的意思是将我们的传输层报文头部去除后可以将数据传输给不同的应用进程。

2 传输层协议

传输层有两个非常重要的协议,分别是TCP协议(传输控制协议)和UDP协议(用户数据报协议)。二者的区别如下:

  • TCP是面向连接的,UDP是没有连接的
  • TCP只能进行一对一的通信,UDP可以实现一对一,一对多,多对多的通信
  • TCP协议是可靠的,UDP协议是不可靠的
  • TCP有流量控制和拥塞控制
  • TCP会对传下来的报文进行拆分,UDP不会对报文进行拆分
  • TCP(20字节)首部开销比UDP(8字节)大

TCP协议适用于需要可靠传输的场景

UDP协议适用于要求相应快的的场景

3 TCP连接的建立

连接建立的过程如下图所示

学新通

  • 客户端发起建立连接的SYN报文,并初始化一个随机序列号seq=x,此时服务端处于listen状态,即监听连接的状态;之后客户端处于SYN_SENT状态
  • 服务端在接受到客户端的SYN报文之后就会给客户端发送一个SYN ACK报文,并初始化一个报文的序列号seq=y,同时确认序列号ack=x 1,之后服务端就进入了SYN_RCVD状态
  • 客户端在接受到服务端的报文会再给服务端发送一个ACK报文,报文序列号seq=x 1,报文的确认序列号为ack=y 1,之后客户端就进入establish状态
  • 服务端接收到客户端发送的ACK报文后也进入establish状态

需要注意的是最后客户端发送的ACK报文是可以携带数据的,而前面两次报文是不携带数据的

4 为什么是TCP三次握手

也是非常经典的问题了,从两个方面来说,一是为什么两次不行,而是为什么不是四次

4.1 为什么不是四次握手

四次握手的意思就是将服务端发送的SYN ACK报文拆分成两次来发送,即SYN报文和ACK报文,这里我们并不需要对该报文进行拆分,因为建立连接的过程中服务端并不需要拆分成两次发送的缓冲状态,一次性发送即可,拆分成两次报文进行发送反而占用网络资源了。

4.2 为什么不是两次握手

1 避免历史连接请求的影响

来看一个情景,客户端发送的SYN报文由于网络堵塞的原因超时重发了新的SYN报文,然后我们旧的SYN报文先到达服务端,服务端在接受到旧的SYN报文后会发送一个ACK报文,在两次握手的情况下这时服务端就处于establish状态了,若之后新的SYN报文到达又会建立一个连接这样明显就造成了连接的重复连接的建立从而导致了资源的浪费。在三次握手的情况下我们客户端在接收到服务端对旧SYN报文的ACK报文时就可以通过上下文发现这是旧的SYN报文的响应,就会再回复一个RST报文告诉服务端这是历史连接,刻意直接丢弃了,这样服务端就会舍弃旧连接了。

2 同步双方的初始序列号

TCP通过序列号的请求应答机制来确认哪些报文被对方接受了,三次握手保证了客户端和服务端初始序列号的相互确认,从而保证了后序的报文传输时可靠的。

5 TCP四次挥手

TCP连接的断开是通过四次挥手来完成的,过程如下图所示,以客户端主动释放连接为例:

学新通

  • 最开始客户端和服务端都处于establish状态,客户端发送FIN报文,意在告诉服务端客户端请求关闭TCP连接,即客户端以后不会再发送数据了,之后客户端进入FIN_WAIT1状态
  • 服务端接受到客户端的FIN报文后客户端发送一个ACK报文,对客户端关闭连接的请求进行确认,然后服务端就进入CLOSE_WAIT状态
  • 客户端在接收到服务端的ACK报文后就进入FIN_WAIT2状态
  • 待服务端处理完数据后就会给客户端发送一个FIN报文,意在告诉客户端自己也不再发送数据了,之后服务端就进入了LAST_ACK状态
  • 客户端在接受到服务端的FIN报文后,会给服务端发送一个对该FIN报文的ACK报文,然后就进入TIME_WAIT状态,待2MSL过后就进入CLOSE状态
  • 服务端在接受到客户端发送的ACK报文后也进入CLOSE状态,至此TCP连接顺利关闭

5.1 为什么是四次挥手?

也是比较经典的问题了,其实就是在问为什么不和TCP连接建立一样采用三次挥手,原因很简单,我们的服务器在接受到客户端的FIN报文后,我们的服务器可能还有数据需要处理,所以需要先发送对于客户端FIN报文的ACK报文,这样客户端才知道自己的FIN报文被收到了,也就不会触发重发机制了。待服务器处理完数据后再发送FIN报文告知客户端服务器也即将关闭TCP连接

6 TIME_WAIT状态

6.1 TIME_WAIT状态为何设置为2MSL

首先来看MSL是什么,MSL是报文在网络中的最大存活时间,可以认为就是报文从一端到另一端需要的时间,而我们报文发送是基于请求应答的方式,我们发送的报文被接受到被确认接受的过程正好是2MSL,所以设置为2MSL,这样倘若在第一个MSL中客户端发送的ACK丢失,则会在第二个MSL触发超时重传机制,从而再次发送ACK报文。那要是后面还丢失报文呢?这里其实就是工程上的一个考量,连续两次丢失报文的概率是在是太小,没必要再为此延长TIME_WAIT状态的时间的。

6.2 TIME_WAIT状态的作用

TIME_WAIT状态主要是为了确保连接的正确关闭和防止延时数据的影响

  • 保证连接的正常的关闭:没有TIME_WAIT或者TIME_WAIT时间太短则客户端在发送ACK报文后很快就进入了CLOSE状态,这样倘若最后这个ACK报文丢失了,服务端由于一直接受不到该ACK报文就会一直处于LAST_ACK状态,即服务端连接无法正常关闭
  • 防止延时数据的影响:假设客户端在establish状态时发送了一个数据包一直阻塞在网络上,若没有TIME_WAIT状态则客户端和服务端之间会比较快关闭连接,这时加入客户端又建立了新的连接,之后原来连接中丢失的数据包到达了,这就会造成数据的干扰

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfcfih
系列文章
更多 icon
同类精品
更多 icon
继续加载