---------------------tcp/ip模型和osi模型---------------------
tcp/ip协议模型   osi模型
应用层       应用层
        表示层
        会话层
传输层       传输层
网络层       网络层
链路层       数据链路层
        物理层

---------------------交换机---------------------
1、网络交换机介绍:
网络交换机(又称“网络交换器”),是一个扩大网络的器材,能为子网络中提供更多的连接端口,以便连接更多的计算机 具有性能价格比高、高度灵活、相对简单、易于实现等特点 以太网技术已成为当今最重要的一种局域网组网技术,网络交换机也就成为了最普及的交换机

2、交换机的作用:
转发过滤:当一个数据帧的目的地址在MAC地址表中有映射时,它被转发到连接目的节点的端口而不是所有端口(如该数据帧为广播帧则转发至所有端口)
学习功能:以太网交换机了解每一端口相连设备的MAC地址,并将地址同相应的端口映射起来存放在交换机缓存中的MAC地址表中

---------------------路由器---------------------
1. 路由器简介
路由器(Router)又称网关设备(Gateway)是用于连接多个逻辑上分开的网络

所谓逻辑网络是代表一个单独的网络或者一个子网。当数据从一个子网传输到另一个子网时,可通过路由器的路由功能来完成

具有判断网络地址和选择IP路径的功能

不在同一网段的pc,需要设置默认网关才能把数据传送过去 通常情况下,都会把路由器默认网关
当路由器收到一个其它网段的数据包时,会根据“路由表”来决定,把此数据包发送到哪个端口;路由表的设定有静态和动态方法

每经过一次路由器,那么TTL值就会减一

---------------------模拟进行客户端、DNS服务器、HTTP服务器实现---------------------


---------------------HTTP请求的流程---------------------
步骤1:浏览器首先向服务器发送HTTP请求

方法:GET还是POST,GET仅请求资源,POST会附带用户数据;

路径:/full/url/path;

域名:由Host头指定:Host: www.xxx.com

以及其他相关的Header;

如果是POST,那么请求还包括一个Body,包含用户数据

步骤2:服务器向浏览器返回HTTP响应

响应代码:200表示成功,3xx表示重定向,4xx表示客户端发送的请求有错误,5xx表示服务器端处理时发生了错误;

响应类型:由Content-Type指定;

以及其他相关的Header;

相应长度:由Content-Length:755

通常服务器的HTTP响应会携带内容,也就是有一个Body,包含响应的内容,网页的HTML源码就在Body中。

步骤3:如果浏览器还需要继续向服务器请求其他资源,比如图片,就再次发出HTTP请求
Web采用的HTTP协议采用了非常简单的请求-响应模式,从而大大简化了开发。当我们编写一个页面时,我们只需要在HTTP请求中把HTML发送出去,不需要考虑如何附带图片、视频等,浏览器如果需要请求图片和视频,它会发送另一个HTTP请求,因此,一个HTTP请求只处理一个资源(此时就可以理解为TCP协议中的短连接,每个链接只获取一个资源,如需要多个就需要建立多个链接)

---------------------tcp协议三次握手和四次挥手---------------------

三次握手

四次握手

---------------------epoll和进程结合模拟实现一个简单的http服务器---------------------

 #coding=utf-8

 #引用对应的数据包
from socket import * import sys import re import select import multiprocessing from time import sleep #创建全局变量
#创建一个epoll对象
epoll=select.epoll() #创建两个字典
#字典1:根据套接字对应的文件标识符对应的套件字
connection={} #字典2:根据套建字对应的文件表示符对应的ip和端口元祖信息
address={} #运行进程
def runProc(recvData,soc,addr,fd):
#引用全局变量进行处理
global epoll
global connection
global address #使用正则,获取到对应的要读取的文件名
fileName=re.search("GET (.*) HTTP",recvData).group(1) print(fileName) #调用函数获取到处理后的地址
fileName=getPath(fileName) #获取文件后缀名,进行相应头文件的准备
fileExt=fileName[fileName.rindex('.')+1:] print ("02-文件的后缀名--:"+fileExt) #存储响应报文
httpHead='' if fileExt.lower() in ['html','css']:
#制定文件的读取操作
fil=open(fileName,'r') #读取制定文件中的数据信息
htmlText=fil.read() #关闭对应的文件对象
fil.close() #创建变量:存储有效的响应头文件
httpHead="HTTP/1.1 200 OK \r\n Content-Type:text/"+fileExt.lower()+" \r\n\r\n"
#进行数据的回复操作
soc.send(httpHead+htmlText) #将该套接字从epoll中注销
epoll.unregister(fd) #从字典中进行排除
del connection[fd]
del address[fd] soc.close() print("%s-------end"%fileExt) elif fileExt.lower() in ['png','jpg','gif']:
#制定文件的读取操作
fil=open(fileName,'rb') #读取制定文件中的数据信息
htmlText=fil.read() #关闭对应的文件对象
fil.close()
httpHead="HTTP/1.1 200 ok \r\n Content-Type:image/"+fileExt.lower()+" \r\n\r\n" #print(fileExt.lower())
#print(htmlText) #sleep(2) #进行数据的回复操作
soc.send(httpHead+htmlText) #将该套接字从epoll中注销
epoll.unregister(fd) #从字典中进行排除
del connection[fd]
del address[fd] soc.close() print("%s------end"%fileExt.lower()) #函数:文件路径
def getPath(fileName):
#变量存储文件地址;
filePath='' print(fileName) #根目录,默认指向./html/Index.html
if fileName[0:4]=='/html':
filePath='.'+fileName
else:
filePath='./html'+fileName print("01-获取到对应的文件路径--:%s"%filePath) return filePath #主函数
def main():
#引用全局变量进行处理
global epoll
global connection
global address #创建服务器套接字
tcpSerSoc=socket(AF_INET,SOCK_STREAM) tcpSerSoc.setsockopt(SOL_SOCKET, SO_REUSEADDR,1) #进行对应数据的绑定
tcpSerSoc.bind(("",int(sys.argv[1]))) #tcp服务器开启被动监听状态
tcpSerSoc.listen(10) #使用epoll对服务器套接字在操作系统中进行注册
epoll.register(tcpSerSoc.fileno(),select.EPOLLIN|select.EPOLLET) #提示开启对应的服务
print("-----开启对应的HTTP服务-----") #循环,对客户端传递过来的数据进行处理
while True:
#通过操作系统获取到要进行数据处理的套接字
epollList=epoll.poll() #遍历所有的套接字进行相应的处理
for fd,event in epollList:
#判断是否为服务器的套接字
if fd==tcpSerSoc.fileno():
#接收客户端对应的数据信息
newSocket,destAddr= tcpSerSoc.accept() print("客户端(%s)以接入HTTP服务器"%str(destAddr)) #将对应的数据向字典中进行存储
connection[newSocket.fileno()]=newSocket
address[newSocket.fileno()]=destAddr #将新的套接字通过epoll向操作系统中进行注册
epoll.register(newSocket.fileno(),select.EPOLLIN|select.EPOLLET) elif event==select.EPOLLIN:
#拿到对应的套接字和ip端口
soc=connection[fd]
addr=address[fd] #进行客户端数据对应的接收操作
recvData=soc.recv(1024) #判断接受的数据是否为空:如果为空表示客户下线
if len(recvData)>0:
#启动一个新的socked进程
p=multiprocessing.Process(target=runProc,args=(recvData,soc,addr,fd))
p.start()
p.join() soc.close()
else: print("客户(%s)以离开"%str(addr)) #将该套接字从epoll中注销
epoll.unregister(fd) soc= connection[fd] #从字典中进行排除
del connection[fd]
del address[fd] #关闭该套接字
soc.close() #关闭服务器套接字
tcpSerSoc.close() #程序入口
if __name__=='__main__':
main()

epoll和进程实现简单的HTTP服务器

HTTP手记的更多相关文章

  1. Linux.NET实战手记—自己动手改泥鳅(上)

    各位读者大家好,不知各位读者有否阅读在下的前一个系列<Linux.NET 学习手记>,在前一个系列中,我们从Linux中Mono的编译安装开始,到Jexus服务器的介绍,以及如何在Linu ...

  2. Linux.NET学习手记(7)

    前一篇中,我们简单的讲述了下如何在Linux.NET中部署第一个ASP.NET MVC 5.0的程序.而目前微软已经提出OWIN并致力于发展VNext,接下来系列中,我们将会向OWIN方向转战. 早在 ...

  3. Linux.NET学习手记(8)

    上一回合中,我们讲解了Linux.NET面对OWIN需要做出的准备,以及介绍了如何将两个支持OWIN协议的框架:SignalR以及NancyFX以OwinHost的方式部署到Linux.NET当中.这 ...

  4. 关于《Linux.NET学习手记(8)》的补充说明

    早前的一两天<Linux.NET学习手记(8)>发布了,这一篇主要是讲述OWIN框架与OwinHost之间如何根据OWIN协议进行通信构成一套完整的系统.文中我们还直接学习如何直接操作OW ...

  5. U3D DrawCall优化手记

    在最近,使用U3D开发的游戏核心部分功能即将完成,中间由于各种历史原因,导致项目存在比较大的问题,这些问题在最后,恐怕只能通过一次彻底的重构来解决 现在的游戏跑起来会有接近130-170个左右的Dra ...

  6. 信息系统实践手记5-CACHE设计一例

    说明:信息系统实践手记系列是系笔者在平时研发中先后遇到的大小的问题,也许朴实和细微,但往往却是经常遇到的问题.笔者对其中比较典型的加以收集,描述,归纳和分享. 摘要:此文描述了笔者接触过的部分信息系统 ...

  7. 信息系统实践手记6-JS调用Flex的性能问题一例

    说明:信息系统实践手记系列是系笔者在平时研发中先后遇到的大小的问题,也许朴实和细微,但往往却是经常遇到的问题.笔者对其中比较典型的加以收集,描述,归纳和分享. 摘要:此文描述了笔者接触过的部分信息系统 ...

  8. SQL Server 2016 CTP2.2 安装手记

    SQL Server 2016 CTP2.2 安装手记 下载一个iso文件,解压出来(大约2.8G左右),在该路径下双击Setup.exe即可开始安装. 安装之前请先安装.NET 3.5 SP1,在服 ...

  9. Knockout.js随手记(2)

    计算属性 konckout.js的API文档,写的极为详细和生动,透过MVVM的运作原理,开发时只需专注于定义ViewModel逻辑,不需耗费心力处理TextBox.Select的onchange.o ...

  10. 随手记一次用C#正则表达式获取下拉菜单html标签<select>以及相关属性值

    随手记一次用C#正则表达式获取下拉菜单html标签<select>以及相关属性值 1:有如下html: .................. <select id="aaa ...

随机推荐

  1. Maven常用的几个核心概念

    在使用Maven的过程中,经常会遇到几个核心的概念,准确的理解这些概念将会有莫大的帮助. 1. POM(Project Object Model)项目对象模型 POM 与 Java 代码实现了解耦,当 ...

  2. 封装自己的Ajax框架

    Ajax技术就是利用javascript和xml实现异步交互的功能. 首先先来介绍一下Ajax相关知识点 一.Ajax对象的创建 1.创建Ajax对象的方式 a.第一种方式是针对IE浏览器 b.第二种 ...

  3. Tencent分布式开源框架Pebble

    最近研究了T分布式开源框架Pebble,基本上想要的基础组件都有了,不过文档很糟糕,这也是T特色,只管开源不管维护:1.支持rpc/reverse_rpc2.支持http驱动3.支持tcp驱动(基于z ...

  4. 使用Fiddler调试手机端页面请求/抓包

    简介 Fiddler作为一个强大的抓包工具,也是非常强大的http(s)协议分析工具,我们通常用它跟踪请求,PC端使用这里暂不做介绍(这里前提是熟悉PC端的使用),使用很简单. 那么我们如何来用它来跟 ...

  5. 解决 CefSharp WPF控件不能使用输入法输入中文的问题(代码已提交到 github)

    首先,本文所有 代码已经提交到github,需要的可以直接从github获取:https://github.com/starts2000/CefSharp,希望可以帮助到有需要的朋友们. CEF 简介 ...

  6. 主流页面编辑器比对:TinyMCE VS FCKeditor

    开发中先用的是 FCKeditor 编辑器,感觉页面展示的东西太繁琐,所以换了 TinyMCE 编辑器. 为了方便理解,本文不采用穿插比对 先看 FCKeditor : 1.jsp :结束标签不能贴着 ...

  7. MySql 求一段时间范围内的每一天,每一小时,每一分钟

    平常经常会求一段时间内的每一天统计数据,或者每一时点的统计数据.但是mysql本身是没有直接获取时点列表的函数或表.下面是自己用到的一些方法,利用临时变量和一个已存在的比较多数据(这个需要根据实际情况 ...

  8. FFmpeg任意文件读取漏洞分析

    这次的漏洞实际上与之前曝出的一个 CVE 非常之类似,可以说是旧瓶装新酒,老树开新花. 之前漏洞的一篇分析文章: SSRF 和本地文件泄露(CVE-2016-1897/8)http://static. ...

  9. Spring-mybatis没有了XXXmapper.java和Dao的实现类还有Service的实现类

    对于刚学过框架的同学可能知道,mybatis有两种主要的配置文件: SqlMapConfig.xml(mybatis全局配置文件,名称不固定,用来配置运行环境(数据源.事务) XXXmapper.xm ...

  10. github、gitlab 管理多个ssh key

    第一种方法: 通过 git 命令行来操作 1.cd ~/.ssh 2.ls 注:如果.ssh 目录下有文件存在那么表示之前添加过 3. ssh-keygen -t rsa -C "xxxxx ...