当前位置: 代码迷 >> 综合 >> TCP、IP
  详细解决方案

TCP、IP

热度:42   发布时间:2024-02-01 19:19:06.0

1、IP 层是「不可靠」的,它不保证网络包的交付、不保证网络包的按序交付、也不保证网络包中的数据的完整性。如果需要保障网络数据包的可靠性,那么就需要由上层(传输层)的 TCP 协议来负责。因为 TCP 是一个工作在传输层的可靠数据传输的服务,它能确保接收端接收的网络包是无损坏、无间隔、非冗余和按序的。

2、TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。

  • 面向连接:一定是「一对一」才能连接,不能像 UDP 协议 可以一个主机同时向多个主机发送消息,也就是一对多是无法做到的;

  • 可靠的:无论的网络链路中出现了怎样的链路变化,TCP 都可以保证一个报文一定能够到达接收端;

  • 字节流:消息是「没有边界」的,所以无论我们消息有多大都可以进行传输。并且消息是「有序的」,当「前一个」消息没有收到的时候,即使它先收到了后面的字节已经收到,那么也不能扔给应用层去处理,同时对「重复」的报文会自动丢弃。

3、TCP连接

用于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括Socket、序列号和窗口大小称为连接。

TCP 四元组可以唯一的确定一个连接,四元组包括如下:源地址、源端口、目的地址、目的端口

4、UDP 、TCP 区别

1). 连接

  • TCP 是面向连接的传输层协议,传输数据前先要建立连接。

  • UDP 是不需要连接,即刻传输数据。

2). 服务对象

  • TCP 是一对一的两点服务,即一条连接只有两个端点。

  • UDP 支持一对一、一对多、多对多的交互通信

3). 可靠性

  • TCP 是可靠交付数据的,数据可以无差错、不丢失、不重复、按需到达。

  • UDP 是尽最大努力交付,不保证可靠交付数据。

4). 拥塞控制、流量控制

  • TCP 有拥塞控制和流量控制机制,保证数据传输的安全性。

  • UDP 则没有,即使网络非常拥堵了,也不会影响 UDP 的发送速率。

5). 首部开销

  • TCP 首部长度较长,会有一定的开销,首部在没有使用「选项」字段时是 20 个字节,如果使用了「选项」字段则会变长的。

  • UDP 首部只有 8 个字节,并且是固定不变的,开销较小。

6). 应用场景

由于 TCP 是面向连接,能保证数据的可靠性交付,因此经常用于:FTP 文件传输、HTTP / HTTPS

由于 UDP 面向无连接,它可以随时发送数据,再加上UDP本身的处理既简单又高效,因此经常用于:包总量较少的通信,如 DNS 、SNMP 等、视频、音频等多媒体通信、广播通信

5、TCP 连接建立

  • 一开始,客户端和服务端都处于 CLOSED 状态。先是服务端主动监听某个端口,处于 LISTEN 状态

。。。。三次握手

注意:第三次握手是可以携带数据的,前两次握手是不可以携带数据的

为什么是三次握手?不是两次、四次?

答:

  • 三次握手才可以阻止历史重复连接的初始化(主要原因)

答:客户端收到后可以根据自身的上下文,判断这是一个历史连接(根据序列号过期或超时),那么客户端就会发送 RST 报文给服务端,表示中止这一次连接,这个RST报文是第三次发送的。

  • 三次握手才可以同步双方的初始序列号

答:两次握手只保证了一方的初始序列号能被对方成功接收,没办法保证双方的初始序列号都能被确认接收。

  • 三次握手才可以避免资源浪费

答:即两次握手会造成消息滞留情况下,服务器重复接受无用的连接请求 SYN 报文,而造成重复分配资源。

注意:序列号能够保证数据包不重复、不丢弃和按序传输。

6、既然 IP 层会分片,为什么 TCP 层还需要 MSS 呢?

  • MTU:一个网络包的最大长度,以太网中一般为 1500 字节;

  • MSS:除去 IP 和 TCP 头部之后,一个网络包所能容纳的 TCP 数据的最大长度;

那么当如果一个 IP 分片丢失,整个 IP 报文的所有分片都得重传。

当接收方发现 TCP 报文(头部 + 数据)的某一片丢失后,则不会响应 ACK 给对方,那么发送方的 TCP 在超时后,就会重发「整个 TCP 报文(头部 + 数据)」。

因此,可以得知由 IP 层进行分片传输,是非常没有效率的。

所以,为了达到最佳的传输效能 TCP 协议在建立连接的时候通常要协商双方的 MSS 值,当 TCP 层发现数据超过 MSS 时,则就先会进行分片,当然由它形成的 IP 包的长度也就不会大于 MTU ,自然也就不用 IP 分片了。

7、 TCP 连接断开

注意:主动关闭连接的,才有 TIME_WAIT 状态。

8、为什么 TIME_WAIT 等待的时间是 2MSL?

MSL是报文最大生存时间,超过这个时间报文将被丢弃,2MSL 的时间是从客户端接收到 FIN 后发送 ACK 开始计时的,如果被动关闭方没有收到断开连接的最后的 ACK 报文,就会触发超时重发 Fin 报文,另一方接收到 FIN 后,会重发 ACK 给被动关闭方, 一来一去正好 2 个 MSL。

9、为什么需要 TIME_WAIT 状态?

1)经过 2MSL 这个时间,足以让两个方向上的数据包都被丢弃,使得原来连接的数据包在网络中都自然消失,再出现的数据包一定都是新建立连接所产生的。

 

2)TIME-WAIT 作用是等待足够的时间以确保最后的 ACK 能让被动关闭方接收,从而帮助其正常关闭。

  相关解决方案