tcp 与 socket

233 阅读2分钟

分层

网络模式中分为应用层(http),传输控制层(tcp/udp),网络层(ip),链路层,物理层。每一层都只负责一部分内容。

  • 应用层只封装了应用数据,比如 http 请求体就是客户端要传输的数据
  • 传输控制层负责连接的打开与关闭,比如 tcp 三次握手四次挥手,前者用于建立连接,后者用于断开。所以它才叫控制层,控制的是链接的打开与关闭

socket

系统提供的一套 api:用于使用 tcp/udp

它的本质就是一套 api,封装了 tcp/udp 协议,使用 socket 就相当于直接与传输控制层打交道。

tcp 与 udp

两者都属性传输控制层的协议。区别如下:

  1. tcp 是面向连接、可靠。tcp 在传输数据之后会通过三次握手建立连接,每一次数据发送之后对方都会给一个 ack 回复,一旦数据发送失败就会重试。所以它保证数据一定会发送成功
  2. udp 不需要建立连接,也不可靠。它会直接将数据发送给对方,完事。因为不需要建立连接,也不需要对方给 ack 回复,所以UDP 的速度比 tcp 快。因此,udp 适用于实时性要求高,但可靠性要求不高的场景

tcp 三次握手

使用三次握手主要目的为:解决网络不可靠问题

假设网络不好,客户端发送的第一个 syn 包未能到达服务端,随后发送了第二个然后顺利建立连接。在随后的某个时间时,第一个 syn 包又到达了服务端。如果只有两次握手,那么服务端会认为客户端是新建立的一个链接,所以给客户端回一个 syn+ack 包后,自己又开辟空间等待客户端发送数据。

假设是三次握手,服务端给出 syn+ack 包后未等到客户端的 ack 包,就不会开辟空间等待客户端数据,从而避免了服务端性能的浪费

tcp 四次挥手

四次挥手主要过程:客户端发 FIN 包,服务端回 ACK 包;服务端发 FIN 包,客户端回 ACK 包。

要注意:客户端回了 ACK 包后,并不是立即断开连接,而是等待一段时间,防止该 ACK 包丢失导致服务端又发一次 FIN 包。当再次收到 FIN 包,客户端还需要再回一次 ACK 包。