目录

一、套接字
  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. ajax、json、jsonp

    这章分享下ajax.json.jsonp的学习记录,不得不说这真是些令人激动的技术. 推荐文章: https://segmentfault.com/a/1190000012469713 http:// ...

  2. Window下安装Scala出现:此时不应有 \scala\bin\..\lib\jline-2.14.5.jar

    scala默认安装到了Program Files (x86)文件夹下.目录中有空格,空格就是导致这个问题的根本原因 把scala安装到其他目录即可 配置scala环境 在环境变量的系统变量里面添加SC ...

  3. 《转》完美解决微信video视频隐藏控件和内联播放问题

    地址:https://blog.csdn.net/xiao190128/article/details/81025378 var u = navigator.userAgent; var isAndr ...

  4. PhoenixFD插件流体模拟——UI布局【Output】详解

    Liquid Output 流体输出  本文主要讲解Output折叠栏中的内容.原文地址:https://docs.chaosgroup.com/display/PHX3MAX/Liquid+Outp ...

  5. 138 条 Vim 命令、操作、快捷键全集

    命令历史 以:和/开头的命令都有历史纪录,可以首先键入:或/然后按上下箭头来选择某个历史命令. 启动vim 在命令行窗口中输入以下命令即可 vim 直接启动vim vim filename 打开vim ...

  6. py_innodb_page_info

    python py_innodb_page_info.py -v /usr/local/var/mysql/ibdata1 mylib.py #encoding=utf-8 import os imp ...

  7. 圆形图片 ImageView

    package com.example.m_evolution; import android.content.Context; import android.graphics.Bitmap; imp ...

  8. 转:Jmeter分布式测试

    在使用Jmeter进行性能测试时,如果并发数比较大(比如最近项目需要支持1000并发),单台电脑的配置(CPU和内存)可能无法支持,这时可以使用Jmeter提供的分布式测试的功能. 一.Jmeter分 ...

  9. 返回 字符串的 form和js组合让页面跳转

    router.get("/wy/jhy").handler(ctx->{ ctx.request().response().setChunked(true); System. ...

  10. selenium启动谷歌浏览器

    谷歌浏览器可以是任意版本. 根据谷歌浏览器的版本,下载响应的浏览器驱动(百度:谷歌驱动与谷歌浏览器版本映射表). 我用的是win7 ,下载win32就行了.下载解压之后可以放在python的安装目录下 ...