一、套接字:
上图是一个C/S架构图
应用层协议有很多,比如HTTP、FTP、TELNET等,也可以自己定义应用层协议。
我们常用的web服务就用到http协议封装文本信息,然后使用TCP/IP做传输层协议将它发到网络上。ftp也是基于TCP/IP传输。
那么问题来了,大家都用TCP协议,主机收到数据,如何区分哪些数据是哪个进程应用的呢??于是就有了端口号。
就好比说两个公司要交流通信。那么最好要有对方的地址,以及收信的部门联系人。
IP好比一个公司的地址,那么端口号就可以看作是具体的部门联系人了。
在建立通信连接的每一端,进程间的传输要有两个标志:IP地址和端口号,合称为套接字地址(socket address)
客户机套接字地址定义了一个唯一的客户进程
服务器套接字地址定义了一个唯一的服务器进程
因此我们可以这么说,而应用层的HTTP、FTP等协议是基于传输层的TCP协议的,而Socket本身不算是协议,就像上面所说,它只是提供了一个针对TCP或者UDP编程的接口。
点击链接查看常用端口号
二、HTTP服务通信过程
三、HTTP相关术语
http: Hyper Text Transfer Protocol, 80/tcp
html: Hyper Text Markup Language 超文本标记语言,编程语言
格式:
<html>
<head>
<title>
</title>
</head>
<body>
<h1></h1>
<p></p>
<h2></h2>
<p> <a href="a.html" >abc </a> </p>
</body>
</html>
- css :cascading style sheet 层叠样式表
- js: javascript
- MIME: Multipurpose Internet Mail Extensions
格式:
major/minor
text/plain
text/html
text/css
image/jpeg
image/png
video/mp4
application/javascript
四、HTTP工作原理
1、http事务
一次HTTP操作称为一个事务:请求<-->响应
其工作过程可分为四步:
1、首先客户机与服务器需要建立连接。只要单击某个超级链接,HTTP的工作就开始了。
2、建立连接后,客户机发送一个请求报文给服务器
3、服务器接到请求后,给予相应的响应报文
4、客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户端与服务器断开连接。
2、http报文
2.1、请求报文格式:
<method> <request-URL> <version>
<headers>
空白行
<entity-body>
请求行
请求行由方法字段、URL 字段 和HTTP 协议版本字段 3 个部分组成,他们之间使用空格隔开。常用的 HTTP 请求方法有 GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT;请求头部
请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息。典型的关键字有:
● User-Agent:产生请求的浏览器类型;
● Accept:客户端可识别的响应内容类型列表;星号 “ * ” 用于按范围将类型分组,用 “ / ” 指示可接受全部类型,用“ type/* ”指示可接受 type 类型的所有子类型;
● Accept-Language:客户端可接受的自然语言;
● Accept-Encoding:客户端可接受的编码压缩格式;
● Accept-Charset:可接受的应答的字符集;
● Host:请求的主机名,允许多个域名同处一个IP 地址,即虚拟主机;
● connection:连接方式(close 或 keepalive);
● Cookie:存储于客户端扩展字段,向同一域名的服务端发送属于该域的cookie;请求包体
请求包体不在 GET 方法中使用,而是在POST 方法中使用。POST 方法适用于需要客户填写表单的场合。与请求包体相关的最常使用的是包体类型 Content-Type 和包体长度 Content-Length;
2.1、响应报文格式:
<version> <status> <reason-phrase>
<headers>
空白行
<entity-body>
状态行
状态码由三位数字组成,第一位数字表示响应的类型,常用的状态码有五大类-
响应头部
- Location:Location响应报头域用于重定向接受者到一个新的位置。
- Server:Server 响应报头域包含了服务器用来处理请求的软件信息及其版本。
- Connection:连接方式;
响应包体
服务器返回给客户端的文本信息;
[root@centos7 ~]#curl http://172.16.80.200 -v
* About to connect() to 172.16.80.200 port 80 (#0)
* Trying 172.16.80.200...
* Connected to 172.16.80.200 (172.16.80.200) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 172.16.80.200
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: nginx/1.10.2
< Date: Wed, 27 Sep 2017 08:44:01 GMT
< Content-Type: text/html
< Content-Length: 21
< Connection: keep-alive
< X-Powered-By: PHP/5.4.16
< X-Varnish: 65538 32785
< Age: 15
< Via: 1.1 varnish-v4
< Accept-Ranges: bytes
<
this is a test web
五、一次Web请求的基本过程
建立连接
接收请求
处理请求
访问资源
构建响应 (封装报文)
发送响应
记录日志 (产生磁盘I/O)