一、socket介绍 二、TCP FSM有限状态机 三、http相关概念 四、http服务器程序
一、socket介绍
1.socket:
C/S
Client:发起应用请求的程序
Server:响应请求(提供服务)的程序
LISTEN:Socket
c/s双方都打开了一个套接字:已经连接的套接字
应用层 应用层
======= =======
传输层: 传输层:
网络层: 网络层:
物理层: 物理层:
===================
X y/server
x层的进程想要和y通信,-->封装传输层首部(IP:sort)-->网络层头部->物理层首部
y接收到后:物理层解封装-->
1.传输层头部:
TCP首部
d端口,s端口,sequence number,ack number,checksum ,urgent pointer,Payload(data)
window //窗口大小,利用滑动窗口告诉对方我的缓冲区大小,窗口大小16bit
//发送缓冲和接受缓冲,过大则进行退避算法
UDP首部:
源端口,目标端口,长度,udp校验和,数据
裸套接字:直接使用ip发送数据包,不经过tcp/udp
raw-socket
2.网络层:
sip,dip
2.传输层协议:tcp,udp,sctp
tcp:transport control protocol
面向连接的协议:双方通信之前需要事先建立虚链路
udp:user datagram protocol
无连接的协议:无需建立虚链路
3.TCP滑动窗口:http://blog.csdn.net/lee576/article/details/1957003
双方流量控制,协商通信双方的通信节奏
滑动窗口,可以理解成接收端所能提供的缓冲区大小
A—————C—————B
如上图,A与B之间建立TCP连接,滑动窗口实现有两个作用:
1.B端来不及处理接收数据(控制不同速率主机间的同步),这时,A通过B端通知的接收窗口而减缓数据的发送。
2.B端来得及处理接收数据,但是在A与B之间某处如C,使得AB之间的整体带宽性能较差,
此时,A端根据拥塞处理策略(慢启动,加倍递减和缓慢增加)来更新窗口,以决定数据的发送。
4.Web Service:
应用层:http,https
实现某类具体应用;
传输层协议:TCP,UDP,SCTP
IANA:端口分配
0-1023:永久分配,特权端口;只有管理员启用或关闭
53:tcp named 区域传送
53:udp named 解析使用
1024-32768:注册端口,但要求不是特别严格,分配给程序注册为某应用使用;3306/tcp:mysql,
32768--60000:客户端程序随机使用的端口,动态端口,或私有端口 //范围定义在/proc/sys/net/ipv4/ip_local_port_range;
/proc/sys/net/ipv4/ip_local_port_range;定义端口分配
BSD Socket:IPC的一种实现,允许位于不同主机(也可以是同一主机)上的进程之间进行通信
UNIX Domain Socket有SOCK_DGRAM或SOCK_STREAM两种工作模式,类似于UDP和TCP,但是面向消息的UNIX Domain Socket也是可靠的,消息既不会丢失也不会顺序错乱。
:进程间通信{远程主机之间}的实现
Socket API(封装了内核中的socket通信相关的系统调用)
二、TCP FSM有限状态机
1.图解:Tcp socket套接字函数:TCP_SOCKET监听
TCP服务器:bind()在套接字上ip:port,监听,准备随时接受accept()客户端请求
TCP三次握手:
A<====>B[s]
1.A发送请求B,这是A==>B的虚链路
2.B回应A并请求A建立连接,这是B==>A的虚链路
3.客户端确认说可以接受了,并发送请求,就可以开始通信了
client调用write()发送请求内容,S:read()读出内容,处理请求
TCP四次断开 //TCP FSM有限状态机
一般是client发起结束请求
A请求S断开,进入FIN_WAIT1,
S收到请求,恢复确认,S进入ClOSE_WAIT,C进入FIN_WAIT2
S发送其他剩余的包,进入LAST_ACK,C进入TIME_WAIT
C确认接受完毕,发送确认给S,进入CLOSED
C:请求断开-->FIN_WAIT1,
S收到请求,回应确认,S-->CLOSE_WAIT,C--->FIN_WAIT2
S发送剩下的包:S--->LAST_ACK,C收到确认信息,C-->TIME_WAIT
C:发送确认,确认接收完毕,发送给s,S:-->CLOSED
C:请求断开,接受确认信息,最后发送确认包
S:响应请求,发送剩下的包,
TCP FSM:
CLOSED,LISTEN,SYN_SENT,SYN_RECV,ESATBLISHED,FIN_WAIT1,CLOSE_WAIT,
FIN_WAIT2,LAST_ACK,TIME_WAIT,CLOSED
四次断开:
C:FIN_WAIT1,FIN_WAIT2,TIME_WAIT
S:CLOSED_WAIT,LAST_ACK,CLOSED
SYN_SEND:c发送链接请求
SYN_RECV:S收到请求
ESTABLISHED:建立链接
TCP协议的特性:有限状态机”(Finite State Machine,FSM)“
建立链接:三次握手
将数据打包切割分段;数据小于MTU,每个包校验和(CRC32)
确认、重传及超时;
排序 //发送的时候是分开传送的,有序列号
流量控制:滑动窗口算法
拥塞控制:慢启动和拥塞避免算法
注:TCP FSM会在下一篇文章中详细解释
2.Socket Type:
SOCK_STREAM:TCP套接字
SOCK_DGRAM:UDP套接字
SOCK_RAW:raw套接字
根据套接字所使用的地址格式:Socket Domain
AF_INET:address family ,IPv4
AF_INET6:IPv6
AF_UNIX:同一主机上的不同进程间基于socket套接字通信使用的一种地址,
:一个进程向一个文件中写,一个进程读
:默认套接字通信需要封装,解封装到传输层,unix socket可以让服务端监听在内存上的一个文件上,任何一个进程可以通过读取该文件获取数据
:也成为UNIX_SOCKET
3.HTTP:hyper text transfer protocol,应用层协议,80/tcp,文本协议
超文本:用html语言开发的文本
html:hyper text mark language,编程语言,超文本标记语言
格式:
<html> <head> <title> TITILE </title> </head> <body> <h1> </h1> <p> jdjsfidsf <a href="http://www.mt.com/"> ..</p> </body> </html>
CSS:cascading style sheet //定义网页的样式 ,层叠样式表
css和xml都是用来标记html样式的语言
js:javaScript,客户端脚本,
AJAX:“Asynchronous Javascript And XML”(异步JavaScript和XML)是指一种创建交互式网页应用的网页开发技术
协议版本:http/0.9真正出现的
http/1.0:cache,MIME,method
http/1.1:增强了缓存功能
spdy:google开源项目
http/2.0
MIME:multipurpose internet Mail Extesion
早期是在SMPT中实现的
method:请求方法定义,
GET,POST,HEAD,PUT,DELETE,TRACE,OPTIONS
工作模式:
http请求报文:http request
http响应报文:http response
Web资源:web resource
静态资源(无需服务端做出额外处理):jpg,png,gif,html,txt,js,css,mp3,avi
动态资源(服务端通过执行程序[js]和服务器端脚本(asp,php)
注意:一个页面中展示的资源可能有多个,每个资源都需要单独请求
加速机制:多线程,静态资源缓存[或者不经常发生改变的resource]到本地浏览器
资源的标识机制:URL
Uniform Resource Locator:用于描述服务器某特定资源的位置
例如:http://www.sina.com.cn/index.html
Scheme:http/ftp/https等协议
Server[:port]
[/Path/to/some_resource]
Schema://Server[:port]/[path/to/some_resource]
三、http相关概念
1、一次完整的http请求处理过程
1.建立和处理链接,接受请求或者拒绝请求
2.接受用户请求;接受来自于网络上的主机请求报文中对某特定资源的一次请求过程;
//每一个请求都要三次握手,四次断开,每个资源都要请求一次
URL:确定并区分请求的目标
3.处理请求:对请求报文进行解析,获取客户端请求的方法等相关信息
4.访问资源;获取请求报文中请求的资源
5.构建响应报文
6.发送响应报文
7.记录日志
S:响应进程通过systemctl call加载目标文件,内核空间(获取数据)-->用户空间,构建响应报文{添加响应报文首部}-->发送响应报文(再次进入内核,封装传输层,ip层等首部)
用户空间(进程system call)-->内核(加载文件)-->用户空间(封装响应报文)-->
2、接受请求的模型:
并发访问响应模型:
单进程I/O模型;启动一个进程处理用户请求,一次只能处理一个请求,多个请求被串行响应
多进程I/O结构:一个客户端可以同时发送多个请求,每个请求S对应一个进程响应
:并发启动多个进程,每个进程响应一个请求
复用I/O结构:一个进程响应n个请求;
多线程模式:一个进程有n个线程,每个线程响应一个请求 //效果有限,因为linux对线程的支持不是很好
事件驱动(event-driven):一个进程直接n个请求 //资源满足进程所需时,通告,内置多个处理机制,或者处理流来针对多个进程
复用的多进程I/O结构:启动m个进程,每个进程生成n个线程
响应请求的数量:m*n
处理请求:分析请求报文的http报文首部
http协议:
http请求报文
http响应报文
请求报文首部的格式:
method,URL,Version
HEADERS;[name;value]
request body
访问资源:获取请求报文中请求的资源
web服务器:负责向请求者提供对方请求的静态资源,或动态资源运行生成的结果
:这些资源通常放在本地文件系统的某路径下,此路径称为"DocumentRoot"
web服务器的资源路径映射方式:
1.DocumentRoot
2.alias
3.虚拟主机的DocumentRoot
4.用户家目录的DocumnetRoot
http请求的连接模式
保持连接(长链接):keep-alive
//复用双向的虚链路,
//建立连接3次: 1:建立c到s的虚链接,2:建立s到c的虚链接
//断开4次:1:断开c到s的链接,2:s回复确认断开,3:s断开到c的链接
//一个页面有n个资源,每个资源请求,都要3链接,4次断开?
非保持连接(短链接):
需要多次建立和断开链接
假如一个用户长期不断开:1.设置链路超时时间,2:限制访问文件个数
四、http服务器程序
linux
httpd(apache)
nginx
lighttpd 轻量级
//只能处理静态内容
应用程序服务器
IIS //可以处理动态内容,.net
tomcat:.jsp
www.netcraft.com //web程序的应用服务器做排名
httpd的安装和使用:
ASF:apache software foundation //有众多项目
httpd,tomcat,hadoop,openoffice
//http://www.apache.org/index.html#projects-list
httpd.apache.org
a patchy server= apache一个充满补丁的服务器
//后期由众多软件工作者,自行维护
本文出自 “黑马腾空” 博客,请务必保留此出处http://hmtk520.blog.51cto.com/12595610/1984111
原文地址:http://hmtk520.blog.51cto.com/12595610/1984111