目录

一、套接字
  1、HTTP与Apache
  2、应用层协议:HTTP
  3、套接字(IP+协议端口的组合)
  4、套接字图示
  5、套接字相关知识点
二、HTTP
 
 
 
 

一、套接字

 
 

1、HTTP与Apache

  HTTP:软件包的包名
  Aapache:软件名
 
 
 

2、应用层协议:HTTP

 
  HTTP协议是应用层协议,同层的协议还有FTP、SMTP、DNS、RPC等

 
 
3、套接字(IP+协议端口的组合)
 
  套接字地址:IP地址和端口号,合称为套接字地址-socket address
 
  在建立通信连接的每一端,进程间的传输要有两个标志:
 
  客户机套接字地址:定义了一个唯一的客户进程
 
  服务器套接字地址:定义了一个唯一的服务器进程

                  套接字:IP地址+端口的组合

 
 
 每个应用程序在同一台主机上,各自有各自的端口号,不会出现两个进程使用同一个端口号的情况。
 
因此,通过IP地址,我们可以找到网络中具体的主机。通过协议对应的端口,我们就唯一地确定了这台主机上应用程序。
 
进而,通过IP地址+协议端口号组成socket,就可以唯一的标识网络通信中双方的地址了,这其中一个是客户端套接字地址,
 
另一个就是服务器套接字地址。
 
 
4、套接字图示
 

  从图中可以看出,位于应用层有多个用户进程,处理这些进程的Socket套接字层如何区分它是哪个应用程序能?
靠的就是协议加端口号。如,当用户访问TCP的80端口,很容易就得出用户的请求响应该回给HTPP还是DNS。
 
 
 

5、套接字相关知识点
 

Socket:
  套接字,进程间通信IPC的一种实现,允许位于不同主机(或同一主机)上,不同进程之间 进行通信和数据交换。
  Socket API于1983年在BSD 4.2上出现。
 
Socket API:
  封装了内核中所提供的aocket通信相关的系统调用
 
Socket Domain:
  根据其所使用的地址分为以下三类
 
  AF_INET: 主要用于IPV4
  AF_INET6: 主要用于IPV6
  AF_UNIX: 同一主机上,不同进程之间通信使用
 
 
 

6、套接字函数
 
 

建立连接前
 
1)服务器端开启创建一个socket对象;
2)创建好的socket绑定一个协议、端口、本地地址等信息;(如ipv4某地址绑定tcp80的端口)
3)将socket置于监听listen状态; (准备开张营业接待用户)
4)客户端也创建一个socket,不同于服务器它不需要绑定端口,因为客户端使用的是随机端口。
5)客户端调用connect函数,发起请求去连接服务器。connect里写入了要连接的对象信息,如服务器ip、端口信息等;
 
建立连接后(双方都处于可发可收)
 
6)服务收到客户端的请求,将对该请求做出响应,如给他发送数据,或接收数据。
同时,客户端也是可以做出接收或发送数据的action.
 
关闭连接
 
7)数据收发完后,双方可以断开连接
 

7、套接字相关系统调用
 
  

  socket(): 创建一个套接字
  bind(): 绑定IP和端口
  listen(): 监听
accept(): 接收请求
connect(): 请求建立连接
write(): 发送
read(): 接收
closed(): 关闭连接
 
 
 
8、Socket模块代码赏析
 
 
  

import socket #
HOST='127.0.0.1' #
PORT=9527
BUFFER=4096
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect((HOST,PORT))
sock.send('hello, tcpServer!') #
recv=sock.recv(BUFFER) #
print('[tcpServer said]: %s' % recv) #
sock.close()
 
 

9、HTTP通信过程
 

 
 
二、HTTP相关术语
 
1、HTTP相关术语
 
http: Hyper Text Transfer Protocol,超文本传输协议, 80/tcp
html: Hyper Text Markup Language 超文本标记语言,编程语言
 
 
 html示例:
<html>
<head>
<title>html语言</title>
</head>
<body>
<h1>标题1</h1>
<p><a href=http://www.magedu.com>马哥教育</a>欢迎你</p>
<h2>标题2</h2>
</body>
</html>
 
 
CSS: Cascading Style Sheet 层叠样式表
 
js: javascript
 
 
MIME: Multipurpose Internet Mail Extensions (最早来源于邮件传输技术)
 
 
多用途互联网邮件扩展 /etc/mime.types
 
格式:major/minor
 
text/plain
text/html
text/css
image/jpeg
image/png
video/mp4
application/javascript
 
 
 
 
 
2、URI、URL和URN
 
URI: Uniform Resource Identifier 统一资源标识,分为URL和URN
 
URN: Uniform Resource Naming,统一资源命名
 
示例: P2P下载使用的磁力链接是URN的一种实现
 
  magnet:?xt=urn:btih:660557A6890EF888666
 
URL: Uniform Resorce Locator,统一资源定位符,用于描述某服务器某特定资源位置
 
 
URN与URL区别:(人名与住址)
 
URN如同一个人的名称,而URL代表一个人的住址。换言之,URN定义某事物的身份,而URL提供查
 
找该事物的方法。URN仅用于命名,而不指定地址
 
 
URL的组成
 
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
 
schame: 方案,访问服务器以获取资源时要使用哪种协议(http、ftp、trsp等)
user: 用户,某些方案访问资源时需要的用户名。(一般匿名不写)
password: 密码,用户对应的密码,中间用:分隔。
 
Host: 主机,资源宿主服务器的主机名或IP地址
port: 端口,资源宿主服务器正在监听的端口号,很多方案有默认端口号(系统默认端口可省略)
 
path: 路径,服务器资源的本地名,由一个/将其与前面的URL组件分隔
params: 参数,指定输入的参数,参数为名/值对,多个参数,用;分隔
query: 查询,传递参数给程序,如数据库,用?分隔,多个查询用&分隔
frag: 片段,锚点。一小片或一部分资源的名字,此组件在客户端使用,用#分隔
 
 
url中的查询
  如电商购物网站搜索产品,在url中会产生查询后台数据库的keyword,这就是查询

url中的锚点
  如网页内容太长,选中该字母则跳转到该字母所在区域,url中以#标识
 

URL示例

http://www.magedu.com:8080/images/logo.jpg
ftp://mage:password@172.16.0.1/pub/linux.ppt
rtsp://videoserver/video_demo/
Real Time Streaming Protocol
http://www.magedu.com/bbs/hello;gender=f/send;type=title
https://list.jd.com/list.html?cat=670,671,672&ev=149_2992&sort=sort_totalsales15_desc&trans=1
http://apache.org/index.html#projects-list

 

 
3、HTTP协议介绍
 
持久连接:建立连接以后三次握手建立连接后不断开,在连接里可以持续发起请求。持久连接(persistent connection),即TCP连接默认不关闭,可以被多个请求复用,不用声明Connection: keep-alive。
 
管道机制(pipelining):即在同一个TCP连接里,客户端可以同时发送多个请求,进一步改进了HTTP协议的效率
 
队头堵塞:同一个TCP连接里面,所有的数据通信是按次序进行的。服务器只能顺序处理回应,前面的回应慢,会有许多请求排队,造成"队头堵塞"(Head-of-line blocking)
 
头信息帧和数据帧:头信息和数据体都是二进制,称为头信息帧和数据帧
 
多工(Multiplexing):复用TCP连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,且不用按顺序一一对应,避免了“队头堵塞“,此双向的实时通信称为多工(Multiplexing)
 
头信息压缩机制(header compression):头信息使用gzip或compress压缩后再发送;客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,不发送同样字段,只发送索引号,提高速度
 
服务器推送(server push):HTTP/2 允许服务器未经请求,主动向客户端发送资源,即服务器推送(server push)
 
 
 
 
 
 
 
 
 
 

HTTP一、HTTP介绍与套接字的更多相关文章

  1. [网络编程之Socket套接字介绍,套接字工作流程,基于TCP协议的套接字程序]

    [网络编程之Socket套接字介绍,套接字工作流程,基于TCP协议的套接字程序] 为何学习socket套接字一定要先学习互联网协议: 1.首先:要想开发一款自己的C/S架构软件,就必须掌握socket ...

  2. (转载)Linux 套接字编程中的 5 个隐患

    在 4.2 BSD UNIX® 操作系统中首次引入,Sockets API 现在是任何操作系统的标准特性.事实上,很难找到一种不支持 Sockets API 的现代语言.该 API 相当简单,但新的开 ...

  3. windows和linux套接字中的select机制浅析

    先来谈谈为什么会出现select函数,也就是select是解决什么问题的? 平常使用的recv函数时阻塞的,也就是如果没有数据可读,recv就会一直阻塞在那里,这是如果有另外一个连接过来,就得一直等待 ...

  4. UNIX网络编程——原始套接字的魔力【下】

    可以接收链路层MAC帧的原始套接字 前面我们介绍过了通过原始套接字socket(AF_INET, SOCK_RAW, protocol)我们可以直接实现自行构造整个IP报文,然后对其收发.提醒一点,在 ...

  5. Go中原始套接字的深度实践

    1. 介绍 2. 传输层socket 2.1 ICMP 2.2 TCP 2.3 传输层协议 3. 网络层socket 3.1 使用Go库 3.2 系统调用 3.3 网络层协议 4. 总结 4.1 参考 ...

  6. 服务器编程入门(13) Linux套接字设置超时的三种方法

    摘要:     本文介绍在套接字的I/O操作上设置超时的三种方法. 图片可能有点宽,看不到的童鞋可以点击图片查看完整图片.. 1 调用alarm 使用SIGALRM为connect设置超时 设置方法: ...

  7. TCP/IP网络编程之网络编程和套接字

    网络编程和套接字 网络编程又称为套接字编程,就是编写一段程序,使得两台连网的计算机彼此之间可以交换数据.那么,这两台计算机用什么传输数据呢?首先,需要物理连接,将一台台独立的计算机通过物理线路连接在一 ...

  8. socket套接字编程 HTTP协议

    socket套接字编程  套接字介绍  1. 套接字 : 实现网络编程进行数据传输的一种技术手段  2. Python实现套接字编程:import  socket  3. 套接字分类 >流式套接 ...

  9. 【TCP/IP网络编程】:09套接字的多种可选项

    本篇文章主要介绍了套接字的几个常用配置选项,包括SO_SNDBUF & SO_RCVBUF.SO_REUSEADDR及TCP_NODELAY等. 套接字可选项和I/O缓冲大小 前文关于套接字的 ...

随机推荐

  1. Unity shader 官网文档全方位学习(二)

    摘要: 这篇文章主要介绍Lighting model及自定义Lighting model 上文咱们学了surface shader.这玩意在开始的时候啊,在定义哪个函数处理surface时用一定要指定 ...

  2. 工程启动没有报错,但是dubbo后台显示没有提供者,工程没有提供服务

    先说一下我遇到的问题:服务工程启动没有异常,消费者工程启动会出现很多nested(嵌套的)错误,但其根本错误是No provider available(缺少服务提供者).可是服务工程起来的时候明明没 ...

  3. 如何用frp进行来无影去无踪

    准备工作 和 注意事项: 1.frp 下载地址  https://github.com/fatedier/frp/releases 2. 需要给有公网ip 的服务端服务器 和 本地客户端服务器 各放一 ...

  4. 自己电脑组一个Wifi热点

    ① 在cmd窗口 ssid 是wifi名称.key是密码 netsh wlan set hostednetwork mode=allow ssid=yb key=15564130 ② ③ 运行脚本 新 ...

  5. mysql in 子查询 效率慢,对比

    desc SELECT id,detail,groupId from hs_knowledge_point where groupId in ( UNION all ) UNION ALL SELEC ...

  6. 12. Integer to Roman (JAVA)

    Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M. Symbol Value I 1 ...

  7. Python的range()函数用法

    Python的range()函数有三种用法,简单地说就是下图的三种用法: 运行结果如下:

  8. java8--List转为Map、分组、过滤、求和等操作----代码示例

    Java 8 函数式编程风格 Java 迄今为止最令人激动的特征.这些新的语言特征允许采用函数式风格来进行编码,我们可以用这些特性完成许多有趣的功能.这些特性如此有趣以至于被认为是不合理的.他们说会影 ...

  9. Kubernetes集群升级(kubeadm升级方式)

    1.升级前的版本确认(相同的大版本号下的小版本升级还是跨版本升级) 例如:从1.12.0升级到1.12.7 或者 从1.12.7升级到1.13.0 2.配置kubernetes安装源(已配置kuber ...

  10. H5端密码控件自动化测试

    最近在做H5端UI自动化测试,其中遇到了一个棘手问题就是密码控件,因为密码控件的按钮每次都是随机不一样的,没法固定去点击输入密码.密码的输入框是div不是input,所以没法用send_keys()这 ...