Web服务基础
admin
2023-03-25 14:41:36
0

一、HTTP概述


HTTP是HyperText Transfer Protocol的缩写,即超文本传输协议。HTTP是应用层协议,同其他应用层协议一样,是为了实现某一类具体应用的协议,并由某一运行在用户空间的应用程序来实现其功能。HTTP是一种协议规范,这种规范是记录在文档上的,为真正通过HTTP协议进行通信的HTTP的实现程序。我们知道,HTTP协议是基于C/S架构的进行通信的,而HTTP协议的服务器端实现程序有httpd、nginx等,其客户端的实现程序主要是Web浏览器,例如Firefox、Internet Explorer、Google chrome、Safari、Opera等,此外,客户端的命令行工具还有elink、crul等。Web服务是基于TCP的,因此为了能够随时响应客户端的请求,Web服务器需要监听在80/TCP端口。这客户端浏览器和Web服务器之间就可以通过HTTP协议进行通信了。



二、IANA定义的端口


我们知道,Web服务器为了让所有客户浏览器程序能够与之通信,通常都需要监听在80端口。用户在浏览器上键入URL时,例如:www.baidu.com,默认端口就是80。这一端口是由IANA(Internet Assigned Numbers Authority )分配指定的。另外,IANA是由ICANN管理的,其定义的端口如下:

0-1023:众所周知的端口,永久地分配给固定的应用使用,这些端口的使用需要特定的应用去注册,属于特权端口,例如Web服务的80/tcp,FTP的21/tcp等。该类端口只有系统管理员才有权限启用,并让进程监听,而普通用户则没有权限。

1024-41951:亦为注册端口,但要求不是特别严格,这些端口分配给程序,并注册为某个应用使用,但这些应用并不是很常见,例如mysql服务的3306/tcp,memcache的11211/tcp等。

41952+:客户端程序随机使用的端口,为动态端口,或私有端口。在Linux上该类端口范围定义在/proc/sys/net/ipv4/ip_local_port_range中。



三、BSD Socket


BSD Socket最早是BSD Unix系统的进程通信机制。Socket即为套接字,作为IPC(Inter-Process Communication,进程间通信)的一种实现,允许位于不同主机上(也可以是同一主机上)的进程间通信机制。Socket可理解为“插座”,只要电线插上了这个“插座”,就可以进行通信了。Socket本质上应该是Socket API,它封装了内核中socket通信相关的通信细节,也就是封装了通信子网(传输层、网络层、数据链路层、物理层)要实现的具体的通信细节,而程序员通过调用Socket API就可以编写能够实现网络通信的程序了。


Socket描述的是IP地址和端口。不同的服务所对应的端口号不同,每种服务需要绑定并监听在一个端口上,打开一个Socket,而客户端可以通过一个Socket跟服务器上的Socket建立连接,这样二者就能实现通信了,我们把正处于通信状态的一对套接字称为已连接套接字。总的来说,Socket是应用层与传输层之间的桥梁,如图。


Web服务基础

前面提到,Socket是对IP地址和端口号的描述,一个IP地址+一个端口就是一个套接字(socket)。根据Socket在传输层使用的协议可分为以下三类:

(1)SOCK_STREAM:tcp套接字

(2)SOCK_DGRAM:udp套接字

(3)SOCK_RAW:raw套接字


这里的raw套接字指的是在不使用任何传输层协议(例如tcp, udp等)的情况下直接通过发送或接收IP数据包实现通信的一种方式,也就是应用层直接绕过像tcp/udp这样的协议直接基于IP数据包通信。


根据Socket监听的地址格式,Socket Domain可分为:

(1)AF_INET:Address Family,IPv4地址格式

(2)AF_INET6:Address Family,IPv6地址格式

(3)AF_UNIX:Address Family,同一主机上不同进程间基于Socket套接字通信所使用的一种地址格式,这种地址的表现形式就是一个套接字文件(Linux一切皆文件);这种地址又称为Unix_SOCK.


接下来介绍TCP客户端和服务器是如何通过TCP套接字接口进行通信的。如图。

Web服务基础

对于TCP服务器端来说,首先需要调用socket()函数,向内核注册申请创建TCP套接字(IP地址+端口);一旦申请成功了,就要通过bind()函数绑定程序到这个套接字上;绑定之后,需要调用listen()函数,使服务器进程监听在这个套接字上,允许套接字进行连接,但此时还不能接收用户请求;只有再调用accept()函数之后才开始负责接收客户端请求,并在客户端请求到达之前一直处于阻塞状态,此时TCP服务器进程的状态为LISTEN。


对于TCP客户端来说,同样需要调用socket()函数创建套接字,但不需要监听;当客户端向服务器发起连接请求时,即调用connect()函数,其中在括号中的参数包括对方服务器的IP地址和端口;如果服务器接收连接请求,则双方进行了tcp三次握手,建立双向的虚链路,此时客户端和服务器之间的套接字处于已连接状态(ESTABLISHED),之后的http请求/响应报文都是基于此前建立的虚链路进行发送。


在Linux上,当连接建立之后,客户端就可以在与服务器建立连接的socket文件上填写需要请求的数据,写入数据就相当于向服务器发送数据了,此过程通过调用write()函数完成;而服务器端则可以在与客户端建立连接的socket文件上读取数据,即调用read()函数,这一过程相当于接收客户端请求的数据,二者之间具体的通信细节由底层的通信子网完成。服务器读取到客户端发送过来的请求报文后,接着进行解析请求、处理请求并构建响应报文,再通过调用write()函数把响应报文写入socket文件,通过通信子网传送到客户端的socket文件上,客户端就可以通过这个socket文件得到服务器的响应报文了。如此往复循环多次,直到客户端请求断开连接(一般是由客户端主动请求断开连接,在使用keep-alive连接方式时则有可能是服务器主动请求断开连接)。


一旦客户端请求断开连接,TCP服务器通过调用read()函数读取socket文件内的断开请求数据,同意断开连接。




相关内容

热门资讯

学生放学回家后又返回学校坠亡,... 学生符某放学后回到家中,后又从家中返回学校,并于当晚从学校教学楼楼顶坠亡。符某父母随后将学校告上法庭...
泽连斯基称乌已向俄方提交100... 当地时间10日,乌克兰总统泽连斯基表示,乌俄双方将以“千人换千人”的方式交换战俘,乌方已向俄方提交了...
国网上海市电力公司举办“明灯引... 5月7日至9日,在第十个“中国品牌日”来临之际,国网上海市电力公司(以下简称“国网上海电力”)以“明...
字跳申请会话信息的发送方法专利... 国家知识产权局信息显示,北京字跳网络技术有限公司申请一项名为“会话信息的发送方法、装置、电子设备、存...
非开挖定向钻机厂家选择指南:郑... 导语:非开挖定向钻机作为市政管道铺设、能源管线穿越等场景的核心设备,其性能稳定性与厂家服务能力直接影...
你昂贵的DDR5内存可能是假货... 快科技5月10日消息,内存价格近期持续走高,亚洲市场出现大量假冒DDR5内存模块,且外观极具迷惑性。...
6G,迎利好!工信部批复 工信部批复6G技术试验频率。 为进一步推动我国6G技术研发、标准研制与产业化进程,工业和信息化部近日...
涉疫邮轮5名法国公民回国,一人... △“洪迪厄斯”号邮轮(资料图)法国总理勒科尔尼10日在社交媒体说,涉汉坦病毒疫情邮轮“洪迪厄斯”号上...
伊朗警告法英两国:只有我们能保... △霍尔木兹海峡(资料图)针对法国和英国计划向红海及霍尔木兹海峡周边海域增派军舰,伊朗副外长加里巴巴迪...
这次对武大不妨多一点包容 1)国内某手机品牌为母亲节准备的文案,引发了很大的争议。2)我想,品牌方肯定也在努力反思当中,它在第...