网络套接字编程
先将数据通过os,将数据发送到目标主机(手段)TCP/IP协议完成,再在本主机将收到的数据推送到自己上层指定的进程,这时候网络通信本质上就成了进程间的通信。其中ip地址可以标识互联网上唯一的一台主机,而端口号可以标识主机内唯一的一个进程。网络通信本质就是通过IP+PORT构建进程的唯一性,来进行基于网络的进程间的通信。
端口号为什么不采用进程的pid?并不是所有的进程都要进行网络间的通信,如果用pid进行标识,旧的对管理进程的结构体加字段来对其是否进行网络通信加字段,其次因为pid是属于os中进程管理模块,如果我们的端口号采用pid就意味着增加了网络通信管理和进程管理的耦合度,一旦进程管理对pid进行了更改还要考虑网络通信管理模块,于是自己新起一套端口号来标识主机中需要进行网络通信的进程。
面向字节流, 在传输层没有报文的概念,它收到一堆的数据,把这一堆的数据交给上层应用层也可以一个字节一个字节的交,对于这个二进制的字节数据如何解释,tcp层是不关心的 ,他只关心应用层要多少就给多少,具体的解释是交由应用层来处理的,这个我们称之为字节流。
网络字节序列是为了解决不同主机 采用大小端存储差异的问题。所以规定:网络序列必须是大端(低地址高权值位而高地址是低权值位),发数据必须转换成为大端,接收数据再按照大端去接收。
为了让大家可以用一套套接字的既可以进行网络间通信又可以进行本地通信,于是设计出了一个公共的数据结构struct sockaddr,这个结构体可以兼容sockaddr_in和sockaddr_un,传递参数的时候根据通信的类型对struct sockaddr进行一下强转就可以了。下面介绍一下sockaddr结构体,因为socket的api需要用到这个变量类型。
lo就是loop,127.0.0.1: 本地环回,就表示的就是当前主机默认对应的ip地址,通常用来进行本地通信或者测试。用来走网络协议栈但是并不用于队中把数据发送到网络。 如果我们在127.0.0.1这个IP地址上测试通过了,但是在网络当中测试的时候不通过,大概率是网络的问题。
我们的云服务器,不需要bind ip地址,需要让服务器自己指定ip地址,但是自己本地装的虚拟机或者物理机器是允许的。
网络通信属于进程间通信的范畴, 我们的网络套接字本质也是文件,有对应的文件描述符。
守护进程
1、进程组分为前台任务和后台任务
2、如果后台任务提到前台,也就是谁当前使用该终端,老的前台任务bash就无法运行了。ctrl+c可以干掉该任务然后让bash重新回到前台运行
3、任何时刻,在会话中只能有一个前台任务在运行!所以我们在命令行启动一个前台进程之后,bash就无法运行了。
4、如果登录就是创建一个会话,bash任务,启动我们的进程,就是在当前会话中创建新的前后台任务,那么如果我们退出呢就是销毁该会话,销毁会话就可能会影响会话内部的所有任务。
一般网络服务器,为了不受到用户登注销的影响,就需要让该进程该会话中独立出来,不要跟任何一个用户会话产生关联,独立成为一个会话,从包含关系变成并列关系,就有了守护进程的运行方式。 pid_t setsid(void)谁调用该函数就把自己设立成为一个新的会话,成功了就返回调用进程的pid。
url
要访问服务器,必须知道服务器的IP+PORT,一般公司提供服务并不是提供的IP+PORT,而是用域名提供服务。域名解析服务:将域名www.baidu.com解析成为ip地址110.242.68.4。
url是统一资源定位符,通过url可以唯一确定全网当中唯一的一份资源,可能是图片、音频等资源,让后通过端口对应的进程将这份资源download下来。登录信息现在不这么用了,现在登录都是网页级别的了,不会再域名当中出现登录信息了。由于服务器端的端口号不能随意指定,必须是总所周知的,且不能随便更改的,所以端口号和成熟的应用层协议是一一对应强相关的。https对应的端口号是443,而http对应的端口号是80,所以为什么访问网站的时候没有加上端口号是因为浏览器会自动识别协议名称,而协议有对应的端口号,所以可以省略端口号。 web根目录不一定是Linux下的根目录,是通过web服务器去跟我们进行解释的,我们要访问某种资源一定要通过根目录配合上反斜杠标识服务器目录下某个路径下的资源。?问号之后代表的是参数,比如说搜索的内容,这些参数最终都是要交给我要访问的资源的。参数是kv的,比如uid(key)=1(value),用&做为分隔符级联多个参数。
url对一些特殊的字符需要进行解码和编码的操作,