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超文本标记语言开发的文本成为超文本

超文本标记语言格式

<html>

  <head>

    <title>TITLE</title>

  </head>

  <body>

    <h1></h1>

      <p>abcd<a href="http://www.abc.com/logo.jpg">abc</a></p>

    <h2></h2>

  </body>

</html>


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年研发完成,但并没有大规模广泛协议,谷歌也将大力支持,所以不久以后将会流行