http基于tcp的通信原理实战✈️

631 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情

记录一次基于socket建立tcp连接的实验。
实验目的:

  1. 了解TCP建立连接的过程
  2. 试处理多并发场景 寻找解决多并发连接怎么处理
  3. 熟悉多线程,多进程

实验过程

demo1 : ----> 单并发连接:

我们想要建立tcp连接,那必不可少的需要一个server端和一个client端,首先利用c语言基于linux的socket接口创建一个socket listen一个端口,如果接收到tcp请求,就建立连接。client端的话,同样的原理使用socket库建立连接。

client

client.png

server

serve.png

结论:通过以上的client和serve的demo我们很容易可以理解TCP的连接过程,我们调用socket接口传入传输层协议类型,ip地址,端口号,socket可以帮助我们完成握手🤝和挥手🙋工作,我们只用关心表层工作,关心数据流的read 和 write,子数据流从buffe中读写的过程中我们不难发现,socket在发送数据时候是有个缓冲区的,这个缓冲区有一定的大小,我们每次取数据都要经过这个缓冲区,关于这个缓冲区其实有很多相关的问题可以讨论(粘包、拥塞控制、流量控制),但是这个不是这个文章要谈论的重点儿,(缓冲区相关内容)。 我们通过这个实验可以发现每次只能建立一个连接,如果我们是一个http-server,难道每次只能解决一个用户的链接吗。10个人访问我的网站,只能先给第一个人交互完毕之后才能和和第二个人交互,这不太行吧🤔,怎么才能让大家都可以同时访问呢?🤔️

demo2: ----> 多并发连接

很多小伙伴就会说了,这简单嘛,不就是多并发操作嘛。利用多进程和多线程嘛,每次到来一个请求 ,咱们就fork一个子进程,或者create一个线程来处理这个连接的内容。这个问题不就解决了嘛。是的,没错 这个问题是可以这样解决,但是是不是成本有点儿大,尤其是每次都fork一个进程,这成本是不是太大了,如果是每次create一个线程来说成本是小了点儿,但是是最优解吗?不过我们仍然要尝试下这两种解决方案;

多进程

fork_server.png

多线程

tread_serve.png

demo3: ----> IO 多路复用

后来我了解到了一个东西叫IO多路复用 ,这个东西来处理并发的socket请求简直是完美,他不需要我们创建大量的进程和线程来处理每一个连接,而是 用一个线程来监听多个soket连接 。是不是很nice。具体操作我会另外开一个文章来记录📝。 这里推荐一个介绍IO多路复用比较好的文章