提供http服务的软件有很多,apache只是其中一个,还有nginx,传统公司用apahce比较多,互联网的用nginx比较多
OSI模型分7层,tCP/IP分四层(应用层,传输层,互联网层,网络接口层)
ssh,tcp协议,mysql协议,都属于应用层,
既然是应用层协议,那就有应用层的报文头部,每一层都有每一层的报文头部,应用层也有应用层的报文头部,tcp/ip协议的报文头部,数据链路层的报文头部,
tcp的3次握手,四次挥手,
http协议也有自己的报文头部
配置DNS反向解析的时候有这个网络名称,实际就是来源于最早的网络名称
这封邮件的原文
OICQ其实是仿照ICQ是以色列开发的软件
最早的电商有8848,艺龙(现在做旅游了),异国
京东就是抓住了04年非典,人家不敢出来,只能网上买东西,发展起来了
OSI的应用层,表示层,会话层=tcp/ip的应用层
传输层=传输层
网络层=internet 层
数据链路层,物理层=网络接口层
跨网络都涉及到2个进程如何通讯,一般都用tcpip协议,所以一般都是基于套接字进行通讯,
两个主机跨网络如何找对对方,就需要套接字socket
套接字就是ip地址加协议端口
通过ip地址可以找到网络中唯一的设备,通过端口就确定了在这台主机上的应用程序地址(不会有两个进程使用同一个端口号),这两个要素组合成socket
从外面浏览器如果访问京东网站,就需要访问京东对应的套接字
浏览器输入www.jd.com
前端利用dns解析把www.jd.com解析成地址,
利用地址找到京东网站的主机,找到主机,因为写的是http://
tcp/ip协议的默认端口号是80,通过ip地址再加上tcp的端口号80就找到了web服务器地址
53是dns服务端口,tcp,udp
每个引用程序,需要有一个socket套接层,这个套接层,把不同的应用程序加以区分(协议和端口号,比如tcp的80端口(到达套接字,就知道是给tcp还是mysql的进程))
socket套接字是为了实现进程间的通讯的,通常是实现不同主机的通讯,要实现socket通讯,就要实现专门的对外网络的开发接口
Socket API,应用程序开发接口,做开发就需要和系统自带的一些程序库去调用,调用库就需要调用API接口
socket 在进行编程的时候,用了一些相关概念,
Domain主要特指协议类型,是IPV4,还是IPV6协议
还有一种是叫UNIX的Domain,是正在同一主机不同进程上使用的,比如mysql的粉色文件
跨网络就不能使用socket文件了,就需要用ipv4或ipv6的跨网络domain 了
在同一台机器上就没必要像在网络中传输一样,解封装,一般都是用.sock文件,来进行通讯
socket类型
三次握手,四次挥手
tcp协议是可靠的,带有相应的标记位fin,ack、数据包的序列号,确认号
udp协议是不可靠的
socket跳过应用层直接调用ip头部
服务器端会打开socket对象
soscket创建好后,会绑定相关协议,包括端口(比如走http的就绑定80)
绑定好后,就打开处于监听状态
监听好后,客户端想要链接,也打开socket,这个socket就不需要绑定端口
直接连接(写上服务器地址和端口号),发送请求
服务器端收到请求就会对客户端进行响应
可以发送数据也可以写数据
客户端也一样,双方都能写和读数据
前面的过程分服务器端和客户端,
一般服务器和客户端建立连接,就谈不上服务器端和客户端了
因为服务器端和客户端都可以发数据和收数据
套接字底层调用的一些功能
tcp服务器端的一个程序,使用pythonn写的
socket 创建资源对象
bind绑定地址和端口
python对于缩进比较严谨
tcp服务器端的一个程序,使用pythonn写的
socket 创建资源对象
bind绑定
导入文件
运行方式跟bash差不多,bash是bash解释器,python是python的解释器
现在就有一个9527的端口监听
0.0.0.0可以本主机所有的ip上
** 代表所有地址*
修改客户端
客户端执行,收到服务器端回的消息
9527是比较大的端口,那么可以使用小的端口吗
成功打开端口
客户端也没上面问题
wang能否允许这个程序
为何会权限拒绝
改了端口号就执行成功了
网络那几章中,端口号是有范围的,1024以上和1024以下的,有些称呼不一样
1023以内的叫特权端口,特权端口就是只有root才有权限
1024以上才能给普通用户
ssh 22端口就是以root方式运行的
MySQL数据库是3306 ,也就是比1023大
http服务普通用户不能启动,所以就需要用root身份打开http服务
http本质通讯过程也是基于socket 的
刚开始创建socket套接字
ip和端口号绑定
开启监听,等待链接
客户端也需要创建一个socket,利用connect链接函数,连接到服务器端,
一旦链接起来以后,双方就会发送数据
http通过tcp豹纹分装数据包,往下传送给网络层封装报文头部,数据链路层再封装,到达另外的就解封装
我们看到的页面并不是原始数据,有些原始数据就被屏蔽了
http超文本传输协议
安装httpd
这个页面就是纯文本的
为了好看一点,需要给它改成超文本
加个标签
http协议最初是用来传输文本的
head、 title标题
就变了
javascript简称js
这个网站还可以测试
java和javascript是没有关系的,雷锋和雷锋塔的关系
CSS类似ansible模版,往里面填东西就可以,但是大体模版都差不多
http早期传输文本,后来发现不同的需求,加调用了MIME,多用于互联网邮件扩展
早期互联网是由邮件方式沟通 的
描述大体分成两块
主要类型,细化类型
类似设备编号
http协议相对较晚的
http早期只支持get
post上传
http协议也有直接的头部文件,是个文本文件可以看懂
content-type 就告诉用户这次传的是多媒体文件,还是文本文件,还是其他类型的文件
头部很多键值对组成,寻找下图片
放什么就识别什么
有可能把图片嵌入到文本文件里
现在访问还是文本,但是实际里面有两种资源(图片和文字)、
报文头部
-I就会看头部的意思
delete代表http不仅可以给你传输数据还能把你 的数据删除,只不过一般网站不支持
通讯是按照次序通讯,一次tcp链接,所有数据是按照顺序通讯的,这样就有可能造成排队现象,为了避免这样的情况发生,
网站的资源都是按顺序一个个下载,下载的话都从一个网站下载就太慢了,为了提高速度,减少请求不太现实
**还有一种方法提高速度就是多开持久链接,建立连接以后不断开,三次握手以后,把页面信息下载下来不断开,在这个链接里面可以发起多次请求,默认情况下网站不支持,关闭了持久链接(三次握手以后,每次链接就传一个数据,传完以后就断开,下次再传的时候还需要建立三次握手,这是比较消耗资源的,)
还可以用合并脚本,样式表,将图片嵌入到css代码中,域名分片(每个资源可能放在不是一个网站,放在不同位置)
**
域名分片,就是在我的页面放的资源有可能不是我本网站的资源,是其他的
大的网站一般是很多服务器提供服务的