计算机网络(3):服务端的应用是如何接受数据包的
针对计算机网络的分层,我们看下各层是由谁实现的
上图比较清晰的给出了答案,应用层由用户进程实现(比如tomgcat、netty等服务器组件),传输层和网络层由内核实现,链路层由网卡驱动实现,物理层就是网卡以及网线等物理材料。
数据收发准备工作
服务器接收客户端的请求之前,要做一系列的准备工作。
服务器需要同时和多个客户端通信, 但一个程序来处理多个客户端的请求是很难的, 因为服务器必须把握每一个客户端的操作状态。 每有一个客户端连接进来, 就启动一个新的服务器程序。首先, 我们将程序分成两个模块, 即等待连接模块和负责与客户端通信的模块。当服务器程序启动并读取配置文件完成初始化操作后, 就会运行等待连接模块。接下来, 当客户端连发起连接时, 这个模块会恢复运行并接受连接,然后启动客户端通信模块, 并移交完成连接的套接字。
在数据收发层面, 客户端和服务端是能够以左右对称的方式自由发送数据,也就是说TCP及以下层级在发送数据这一方面对于客户端和服务端并无二样。但是有一个层面是无法左右对称的,那就是连接,只有一个端在等待接收连接,另一个端才可以发起连接。我们称等待连接的一方为服务端,发起请求的一端是客户端。
服务端主要的步骤有:
1、创建套接字
2、调用 bind 将端口号写入套接字中
3、协议栈会调用 listen 向套接字写入等待连接状态这一控制信息
4、协议栈会调用 accept 来接受连接
5、包达到后,复制一个副本(即创建一个新的套接字)与客户端通信
<