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网络通信

文章插图
在网络通信中,套接字一定是成对出现的 。一端的发送缓冲区对应对端的接收缓冲区 。
重点:套接字本质上也是一个文件描述符 , 指向的是一个“网络文件” 。普通文件的文件缓冲区对应的是磁盘,数据先写入文件缓冲区,再刷新到磁盘,“网络文件”的文件缓冲区对应的是网卡 , 它会把文件缓冲区的数据刷新到网卡,然后发送到网络中 。创建一个套接字做的工作就是打开一个文件,接下来就是要将该文件和网络关联起来,这就是绑定的操作,完成了绑定,文件缓冲区的数据才知道往哪刷新 。
网络字节序我们已经知道,内存中的多字节数据相对于内存地址有着大端和小端的区分 。同样,网络数据流同样有大端和小端的区分 。
思考一下,如何定义网络数据流的地址呢?
发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出,接收主机把从网络上接到的字节一次保存在接收缓冲区中,也就是按照内存地址从低到高的顺序保存 。

推荐阅读