-
NET 网络专题汇总-06-23-用了 TCP 协议,数据一定不会丢吗?
Q
问大家一句:TCP 是一个可靠的传输协议,那它一定能保证数据不丢失吗?
这次,就跟大家探讨这个问题。
数据包的发送流程
首先,我们两个手机的绿皮聊天软件客户端,要通信,中间会通过它们家服务器。大概长这样。
用户A 《=》 服务器 《=》 用户B
但为了简化模型,我们把中间的服务器给省略掉,假设这是个端到端的通信。且为了保证消息的可靠性,我们盲猜它们之间用的是TCP协议进行通...
2023-02-22 00:00:00 |
Net
-
NET 网络专题汇总-06-22-没有 accept,能建立 TCP 连接吗?
Q
这次,我们来讨论一下,没有 accept,能建立 TCP 连接吗?
下面这个动图,是我们平时客户端和服务端建立连接时的代码流程。
对应的是下面一段简化过的服务端伪代码。
int main()
{
/*Step 1: 创建服务器端监听socket描述符listen_fd*/
listen_fd = socket(AF_INET, SOCK_STREAM,...
2023-02-22 00:00:00 |
Net
-
NET 网络专题汇总-06-21-服务端没有 listen,客户端发起连接建立,会发生什么?
问题
服务端如果只bind了ip和端口,但是没有调用Listen让这个socket监听连接,这时候如果客户端朝这个服务端socket发数据,会发生啥?
这位读者的角度是以为服务端没有调用 listen,客户端会 ping 不通服务器,很明显,搞错了。
ping 使用的协议是 ICMP,属于网络层的事情,而面试官问的是传输层的问题。
针对这个问题,服务端如果只 bind 了 IP 地址...
2023-02-22 00:00:00 |
Net
-
NET 网络专题汇总-06-20-TCP 和 UDP 可以使用同一个端口吗?
问题
之前有读者在字节面试的时候,被问到:TCP 和 UDP 可以同时监听相同的端口吗?
关于端口的知识点,还是挺多可以讲的,比如还可以牵扯到这几个问题:
多个 TCP 服务进程可以同时绑定同一个端口吗?
重启 TCP 服务进程时,为什么会出现“Address in use”的报错信息?又该怎么避免?
客户端的端口可以重复使用吗?...
2023-02-22 00:00:00 |
Net
-
NET 网络专题汇总-06-19-如何基于 UDP 协议实现可靠传输?
如何基于 UDP 协议实现可靠传输?
我记得之前在群里看到,有位读者字节一面的时候被问到:「如何基于 UDP 协议实现可靠传输?」
很多同学第一反应就会说把 TCP 可靠传输的特性(序列号、确认应答、超时重传、流量控制、拥塞控制)在应用层实现一遍。
实现的思路确实这样没错,但是有没有想过,既然 TCP 天然支持可靠传输,为什么还需要基于 UDP 实现可靠传输呢?这不是重复造轮子吗?
...
2023-02-22 00:00:00 |
Net
-
NET 网络专题汇总-06-18-TCP 协议有什么缺陷?
TCP 协议有什么缺陷?
写的多了后,忽然思考一个问题,TCP 通过序列号、确认应答、超时重传、流量控制、拥塞控制等方式实现了可靠传输,看起来它很完美,事实真的是这样吗?TCP 就没什么缺陷吗?
所以,今天就跟大家聊聊,TCP 协议有哪些缺陷?主要有四个方面:
升级 TCP 的工作很困难;
TCP 建立连接的延迟;
TCP 存在队...
2023-02-22 00:00:00 |
Net
-
NET 网络专题汇总-06-17-TCP Keepalive 和 HTTP Keep-Alive 是一个东西吗?
大致问题是,TCP 的 Keepalive 和 HTTP 的 Keep-Alive 是一个东西吗?
这是个好问题,应该有不少人都会搞混,因为这两个东西看上去太像了,很容易误以为是同一个东西。
事实上,这两个完全是两样不同东西,实现的层面也不同:
HTTP 的 Keep-Alive,是由应用层(用户态) 实现的,称为 HTTP 长连接;
TCP 的 K...
2023-02-22 00:00:00 |
Net
-
NET 网络专题汇总-06-16-HTTPS 中 TLS 和 TCP 能同时握手吗?
面试
有位读者在面试的时候,碰到这么个问题:
面试官跟他说 HTTPS 中的 TLS 握手过程可以同时进行三次握手,然后读者之前看我的文章是说「先进行 TCP 三次握手,再进行 TLS 四次握手」,他跟面试官说了这个,面试官说他不对,他就感到很困惑。
我们先不管面试官说的那句「HTTPS 中的 TLS 握手过程可以同时进行三次握手」对不对。
但是面试官说「HTTPS 建立连接的过...
2023-02-22 00:00:00 |
Net