TCP套接字编写,多进程多线程版本 Linux网络通信

预备知识源IP地址和目的IP地址IP地址在上一篇博客中也介绍过,它是用来标识网络中不同主机的地址 。两台主机进行通信时,发送方需要知道自己往哪一台主机发送,这就需要知道接受方主机的的IP地址,也就是目的IP地址,因为两台主机是要进行通信的,所以接收方需要给发送方进行一个响应,这时接收方主机就需要知道发送方主机的IP地址,也就是源IP地址 。有了这两个地址,两台主机才能够找到对端主机 。

  • 源IP地址: 发送方主机的IP地址,保证响应主机“往哪放”
  • 目的IP地址: 接收方主机的IP地址,保证发送方主机“往哪发”
端口号端口号是属于传输层协议的一个概念,它是一个16位的整数,用来标识主机上的某一个进程
注意:一个端口号只能被一个进程占用
在上面说过,公网IP地址是用来标识全网内唯一的一台主机,端口号又是用来标识一台主机上的唯一一个进程,所以IP地址+端口号 就可以标识全网内唯一一个进程
端口号和进程ID:二者都是用来唯一标识某一个进程 。它们的区别和联系是:
一台主机上可以存在大量的进程,但不是所有的进程都需要对外进行网络请求 。任何的网络服务和客户端进程通信,如果要进行正常的数据通信,必须要用端口号来唯一标识自身的进程,只有需要进行网络请求的进程才需要用端口号来表示自身的唯一性,所以说端口号更多的是网络级的概念 。进程pid可以用来标识所有进程的唯一性,是操作系统层面的概念 。二者是不同层面表示进程唯一性的机制 。
源端口号和目的端口号:两台主机进行通信,只有对端主机的IP地址只能够帮我们找到对端的主机,但是我们还需要找到对端提供服务的进程,这个进程可以通过对端进程绑定的端口号找到,也就是目的端口号,同样地,对端主机也需要给发送方一个响应,通过源IP地址找到发送方的那一台主机,找到主机还是不够的,还需要找到对端主机是哪一个进程发起了请求,响应方需要通过发起请求的进程绑定的端口号找到该进程,也就是源端口号,然后就可以进行响应 。
  • 源端口号: 发送方主机的服务进程绑定的端口号,保证接收方能够找到对应的服务
  • 目的端口号: 接收方主机的服务进程绑定的端口号,保证发送方能够找到对应的服务
socket通信的本质: 跨网络的进程间通信 。从上面可以看出,网络通信就是两台主机上的进程在进行通信 。
注意:一个局域网才拥有一个独立的IP,IP地址只能定位到一个局域网,无法定位到具体哪台设备,要想定位到哪台设备,就必须知道这个设备的MAC地址,IP地址解决的是数据在外网(因特网,互联网)的传输问题,而MAC解决的是数据在内网(局域网)的传输问题,但是MAC地址不需要我们组包,链路层底层协议栈就会帮你组好 。
Socket套接字Socket 是在应用层和传输层之间的一个抽象层,它把 TCP/IP 层复杂的操作抽象为几个简单的接口,供应用层调用实现进程在网络中的通信 。Socket 起源于 UNIX,在 UNIX 一切皆文件的思想下,进程间通信就被冠名为文件描述符(file descriptor),Socket 是一种“打开—读/写—关闭”模式的实现,服务器和客户端各自维护一个“文件”,在建立连接打开后,可以向文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件 。
TCP套接字编写,多进程多线程版本 Linux网络通信

文章插图
在网络通信中,套接字一定是成对出现的 。一端的发送缓冲区对应对端的接收缓冲区 。

经验总结扩展阅读