socket收发消息原理
服务端和客户端想要通信,底层需要internet物理连接,网卡配备有IP地址和MAC地址,网卡收发的消息是字节流。服务端程序和客户端程序工作中应用层,服务端程序要想发包,必须一层一层往下走,走到网卡那一层,将数据转化成二进制才能送到客户端 ,客户端网卡收到包,一层一层往上送,然后客户端程序才能接收到数据。客户端发包服务端接收也是如此。
内存分为用户态和内核态。简单来说,内核态内存是操作系统运行时内核代码占用的内存;用户态是用户程序运行时占用的内存。两者不能混在一起,操作系统的一个目的是操作底层硬件,如果能混在一起,没有用户态和内核态之分,意味着应用程序就能够直接操作底层硬件 ,便没有权限划分一说,那便不需要操作系统。应用软件想要操作硬件必须通过操作系统发起请求。
socket程序要想把数据发出去,需通过底层网卡,意味着应用程序要操作底层硬件,必须通过操作系统,因此socket应用程序收发消息都是通过内核态内存。
发数据时,数据从用户态内存发送到内核态内存,发送到内核态中的数据由操作系统接收,操作系统再操作网卡把数据转化成二进制,然后发送到对端。发到对端以后,由对端的网卡接收,然后交给对端的操作系统,相当于交给了内核态内存,然后用户态的socket应用程序再从内核态中取。