01套按字及http基础知识
——以下内容摘自马哥教育课堂
OSI参考模型
资源子网(3)+通信子网(4)
应用层细节 通信细节
用户空间 内核空间
每种用户空间程序有自己的通信协议
进程之间通信如何标记?
MAC设备到设备通信地址
IP主机到主机通信地址
传输层提供进程地址
进程地址通过端口号来提供
tcp传输控制协议,面向连接的协议,通信之前需要建立虚拟链路,通信完成后拆除链路,提供可靠数据流通信协议
udp用户数据报协议,无连接协议
进程如何使用端口号这种地址?
进程要向内核注册申请端口号
dns:udp+tcp
ssh:tcp
http:tcp
内核如何标记一个跨主机通信的进程?通过套接字来标记
套接字是socket,IPC的一种实现机制(还有信号),允许位于不同主机、同一主机上的不同进程之间进行通信,从而完成数据交换
SOCKET API库调用接口——1983年出现在4.2 BSD版本中,后被广泛移植到各种linux版本中
tcp端口号0-65535
udp端口号0-65535(qq通信)
由IANA进行分配
0-1023:特权端口,管理员启动进程才可使用,永久分配给固定的应用使用,22/tcp(ssh),80/tcp(http),443/tcp(https)
1024-41951: 特权端口,亦为注册端口,但要求不严格,比如memcache使用11211/tcp,11211/udp,mysql使用3306/tcp,但如果一个服务器没有启动mysql服务,其他服务占用了3306端口也未尝不可
41952+:客户端程序随机使用的端口。比如浏览器使用随机端口连接web服务80端口,ssh连接服务器端sshd22也是使用随机端口的。其范围的定义:/proc/sys/net/ipv4/ip_local_port_range
用户空间的进程向外通信时,需要向内核注册使用一个TCP端口或者UDP端口或者直接调用IP地址封装报文进行通信。第三种称为裸套接字
SOCK_STREAM:tcp套接字
SOCK_DGRAM:udp套接字
SOCK_RAW:裸套接字
OSI七层模型的思想——模块化设计
ip层:将数据切割成ip报文来通信
ip协议是不可靠,无连接的,但基于TCP协议可以实现可靠传输
MTU最大传输单元——1500字节,是LAN层的封装,所以会包括IP,MAC等封装
而老版本的路由器最多支持500字节的MTU,这样就需要再分片
ipv4分类:
A:1-127
B:128-191
C:192-223
D:224-239
E:240-254
私有地址
A:10.0.0.0/8
B:172.16.0.0/16-172.31.0.0./16
C:192.168.0.0/24-192.168.255.0/24
节点之间通信
发送缓冲---->接收缓冲
接收缓冲<----发送缓冲
内核生成数据比网卡发送数据的速度快,所以需要缓冲
TCP协议特性
①三次握手建立连接
②将数据打包成段并使用CRC-32算法计算出校验和附加到后面
③确认、重传和超时机制
④数据打包成段后需要排序
⑤流量控制,通过滑动窗口算法
⑥拥塞控制:快发慢收会把接受方压垮,所以发送方需要做拥塞控制,采用慢启动方式,拥塞避免算法
socket domain(socket分类)
根据其所用的地址分类
AF_INET:address family ipv4
AF_INET6:IPV6
AF_UNIX:同一主机上不同进程通信,比基于tcp/ip通信效率更高,直接通过内核进行通信而无需封装ip,拆解ip
上述三类每类套接字至少提供了两种socket:流,数据报
流是可靠的传递,面向连接,无报文边界
数据报:不可靠传递、无连接、有报文边界(有边界理解:开始报告,over,请指示这类话称为边界术语)
与套接字相关的系统调用,C程序:
socket():创建socket,向内核申请套接字
bind():进程和套接字绑定
listen():进程监听套接字
accept():接收请求
connect():客户端请求连接建立
write():向一个套接字文件写数据,实现发送数据
read():从一个套接字文件读数据,实现数据接收
read(),recv(),sendto(),recvfrom()
上面的系统调用如果没有被实现就会阻塞(开party听敲门)
http协议:超文本传输协议
html超文本标记语言开发的文本成为超文本
超文本标记语言格式
abcdabc
CSS:级联样式表
cascading style sheet
js:javascript,浏览器执行的脚本
网站优化:多个js合并成一个,因为js执行是串行的
HTTP引入MIME才支持图片,mp3,mp4,实现了基于文本传输协议发送非文本数据
MIME:多用途邮件扩展,把非文本编码成文本,并能够还原回来
http监听tcp80端口,基于流式数据完成数据交换
http工作原理:
http实现的主要功能:跨主机发送文档
服务器端存放有一些超文本在磁盘上,客户端使用浏览器可以向服务器申请获取某一文档,这个文档有唯一的标记地址。当服务端收到请求时,先送到内核分析其请求的端口号为80,将其转交给监听此端口的应用程序。web进程收到以后,分析其请求的应用层URL,也就是请求哪个超文本文件。如果存在此文件,则从磁盘上加载此文件,将其封装为html的响应报文通过网络发回客户端。这就是一次http协议通信过程。
http的工作机制:
一个http请求对应一个http响应
服务器上可以被请求称为web资源,web资源有静态资源和动态资源,静态资源有超文本文档,文本文件,图片,jpg,gif,html,txt,js,css,mp3,avi都是静态资源;
动态资源有php页面,jsp页面等,动态资源是不能直接发给客户端,而是应该在服务器端运行以后把运行结果发还给客户端。
比如把"free -m"这行文本直接发给客户端称为静态资源。而把"free -m"的执行结果发给客户端称为动态资源。比如php,jsp。
超文本中媒体资源支持的类型成为MIME类型
主类型/次类型
text/html
text/plain
p_w_picpath/jpeg
p_w_picpath/gif
video/avi
一个网页文件、一张图片都是一个资源,所以一个请求中其实包含了多个资源。例如请求一个网站首页会引用许许多多的资源。一个页面资源可以链接本地资源,也可以链接站外资源。而如果一个页面未经授权就链接了一个站外资源称为盗链,经过授权的称为跨站引用。
如何标记资源——通过URL
URL是URI的子集
URI:统一资源标识符,可以标识互联网上的任意资源
URL: 统一资源定位符,用于描述某服务器上某特定资源的位置
URL的组成部分:
Scheme://server_address:port/path/to/resource
http://www.magedu.com:80/p_w_picpaths/logo.jpg
[URN:统一资源命名符]
浏览器F12,进入开发者界面
http协议版本:
HTTP/0.9:原型版本,只支持文本交互,不支持多媒体
HTTP/1.0:第一个被广泛使用的http版本,支持MIME机制
HTTP/1.1:增强了缓存功能
谷歌研发了spdy协议
HTTP/2.0:2002年研发完成,但并没有大规模广泛协议,谷歌也将大力支持,所以不久以后将会流行