TCP/IP是互联网相关联协议的统称,也可以指TCP和IP这两种协议。
TCP/IP采用分层设计,可分为应用层、传输层、网络层、数据链路层四层。层次化的好处和面向对象封装的思想有类似的地方。即每个层次独立存在,可以单独变动而不影响其他层次,也只需要考虑实现好本层次的责任即可。
- 应用层。提供应用层面的协议,包括文件传输协议FTP(File Transfer Protocol)、超文本传输协议HTTP(HypeText Transfer Protocol)、域名系统DNS(Domain Name System)等。
- 传输层。提供处于网络连接中的两台计算机的数据传输。包括传输控制协议TCP(Transmission Control Protocol)和用户数据报协议UDP(User Data Protocol)。
- 网络层:用来处理网络上流动的数据包。数据包是网络传输的最小数据单位。该层决定了多条传输路线中的选择,以及对于数据包的传递。包含网际协议IP(Internet Protocol)。
- 数据链路层:用来处理硬件等物理传输媒介部分。
IP
IP实际是指网际协议,位于第三层网络层,作用是把数据包传给对方。包含两个重要概念,IP地址和MAC地址(Media Access Control Address)。IP地址指明了节点被分配到的地址,MAC地址指明了网卡所属的固定地址。IP地址和MAC地址用来配对,IP可变,MAC一般不可变。
IP之间的通讯依赖于MAC地址,因为网络通讯一般要通过多次中转才能传输到终点,中转中下一站的确定是通过MAC地址来确定的,此时会通过地址解析协议ARP(Address Resolution Protocol)来根据IP地址获取MAC地址。这种中转的具体途径是无法人为选择确定的,这种叫做路由选择(Routing)。
TCP
TCP位于第二层传输层,提供可靠的字节流服务。字节流服务(Byte Stream Service)是指TCP为了确保传输的方便而把大块数据分割成以报文段(segment)为单位的数据包进行管理。TCP的另一个特性就是可靠,它会确认传输是否送达。
要达到可靠这个目标,TCP主要采用三次握手这种策略,包含两种flag,SYN(synchronize)和ACK(acknowledgement)。发送端先发送带SYN标志的数据包给接收端,接收端回传包含SYN/ACK的数据包给发送端,发送端再发送带ACK的数据包给接收端,即三次握手。
DNS
DNS提供从域名到IP地址的解析,或者从IP地址反查域名。
请求的流程介绍
发送端应用层HTTP协议通过域名生成针对指定Web服务器的HTTP请求报文。然后到传输层TCP协议把报文分割成报文段,可靠地传递。网络层IP协议查找对方地址,一边中转一遍传输。到了接收端这边,TCP协议重组对方发送的报文,HTTP协议对请求的内容进行处理。请求的处理结果也同样通过TCP/IP通信协议进行传递。
URI
URI(Uniform Resource Indentifier) 是某个协议方案表示的资源的标识符,URL是某一互联网资源的位置。URL是URI的子集。
URI的举例:
ftp://ftp.is.co.za/rfc/rfc.txt
http://www.baidu.com
tel:+1-816-555-1212
URI的格式:
http://user:pass@www.example.com:80/dir/index.htm?uid=1#ch1
http是协议方案名,user:pass是登录信息,www.example.com是服务器地址,80是端口号,dir/index/htm是带层次的文件路径,uid=1是查询字符串,ch1是片段标识符。
HTTP讲解
HTTP规定,请求从客户端发起,服务端响应请求并返回。如果客户端没有请求,服务端也就不会发送响应。
请求报文由请求方法(method)、请求URI、客户端使用的协议版本、可选的请求首部字段和内容实体组成。
GET /index.htm HTTP/1.1
Host: baidu.com
以下是请求首部字段
Connection: keep-alive
Content-type: application/x-www-form-urlencoded
Content-length:16
以下是内容实体
name=abc&age=15
响应的格式:服务端使用的协议版本、处理结果状态码、原因短语、首部字段、实体主体
HTTP/1.1 200 OK
首部字段
Date: Tue, 10 Jul 2012 06:50:15 GMT 创建响应的时间
资源实体的主体
Content-length 234
Content-type: text/html
HTTP是一种无状态协议,即对于发送过的请求和响应都不进行保存,为了达到保存信息的目的,引入了Cookie这个技术。
HTTP method
GET:获取资源
用来请求已经被URI识别的资源,指定的资源经服务器解析后返回响应内容。
POST:传输实体主体 entity body
虽然GET也可以传输实体主体,但是一般使用POST来传输。POST的主要目的不是获取响应的主体。
PUT:传输文件
HEAD:获取报文头部
与GET方法一样,只是不返回报文主体部分,用于确定URI的有效性和更新日期等。
DELETE:删除文件,与PUT相反
OPTIONS:查询支持的方法
TRACE:追踪路径
CONNECT:要求用隧道协议
要求与代理服务器通讯时建立隧道,实现用隧道进行TCP通信,主要使用安全套接层SSL(Secure Sockets Layer)和传输层安全TLS(Transport Layer Security)两种协议加密后经网络隧道传输。
持久连接
HTTP keep-alive:只要任意一端没有明确提出断开连接,则保持TCP连接状态,节省通信开销。HTTP/1.1所有连接默认都是持久连接。
管线化
pipelining,并行发送多个请求,不需要等到响应返回才发送下一个请求。
Cookie
HTTP是无状态的,要做到保存状态,则服务器会发送一个首部字段Set-Cookie,通知客户端保存Cookie,当下次客户端再次向该服务器发送请求时,自动在请求报文中加上Cookie值,即可实现状态保存。
HTTP报文
用于HTTP协议交互的信息叫做HTTP报文。请求端的报文叫做请求报文,服务端的报文叫做响应报文。HTTP报文本身是由多行数据构成的字符串文本,用CR(Carriage Return回车符,0x0d)+LF(Line Feed换行符,0x0a)作为换行符。HTTP报文一般包括报文首部和报文主体,两者由最初出现的CR+LF来区分,报文主体是可选的。
报文是HTTP通信的基本单位,由字节流组成,通过HTTP通信传输,而entity是请求或响应的有效载荷数据。HTTP报文主体用来传输请求或响应的entity body。通常报文主体等于entity body,只有传输中进行编码方便传输的情况下才会改变entity body,与报文主体产生差异。
分块传输编码
在传输大容量数据时,通过把全部数据分割成多块可以让浏览器逐渐显示页面,这种叫做分块传输编码(Chunked Transfer Coding)。分块传输编码把实体主体分为多块,每块用十六进制标记大小,最后一块使用0(CR+LF)来标记。
Multipart
发送的一份报文主体内可以包含多类型实体,通常是在图片和文件上传时使用。需要在首部字段加入Content-type字段,每个类型实体中,又可以含有首部字段。首先首部字段Content-type字段中添加自己指定的boundary字段来划分指定的各类实体,然后在主体中需要发送的类型实体前面和结束处都添加
–指定的boundary内容 。
指定实体范围
使用首部字段Range来指定资源的byte范围
Range:bytes=5000-10000 返回5000到10000的字节
Range:bytes=5000- 返回5000到结束
Range:bytes=-3000,5000-7000 返回开始到3000,5000到7000的字节的多重范围
如果服务端可以响应范围请求,则可以返回206 Partial Content,如果无法响应则会返回200和完整实体内容。
Content Negotiation
内容协商是指客户端和服务端对于响应返回的内容进行协商,返回最适合客户端的内容,如语言等。通过请求报文的下列首部字段来确定:
Accept、Accept-Charset、Accept-Encoding、Accept-Language、Content-Language等。
HTTP状态码
2XX Success(成功状态码):请求正常处理完毕
3XX Redirection(重定向状态码):需要进行附加操作以完成请求
4XX Client Error(客户端错误码):服务器无法处理请求
5XX Server Error(服务端错误码):服务器处理请求出错
也可能发生状态码和实际状态不一致的情况。
2XX 成功
200 OK:请求成功,如果是GET方法则会返回请求资源的实体,如果是HEAD,则只返回报文首部
204 No Content:请求成功,但是返回的响应报文没有entity body。
206 Partial Content:范围请求成功,返回范围数据
3XX 重定向
301 Move Permantly:永久性重定向,即请求的资源已经被分配了新的URI,应该使用Location首部字段提示的URI去访问。
302 Found:暂时性重定向,虽然也重新分配了URI,但是可能改变。
303 See Other:表示请求对应的资源存在另一URI,应该使用GET方法去访问对应的URI。与302功能一样,但是明确表示希望客户端使用GET方法访问。
304 Not Modified:表示客户端发送指定条件的请求,服务端允许访问资源,但是没有符合条件的资源。返回不包含entity body。虽然是以3开头,但是和重定向没有关系。
307 Temporary Redirect:临时重定向。与302 Found一样,但是请求方法会依照标准不会从POST变成GET。
4XX 客户端错误
400 Bad Request:请求报文存在语法错误,浏览器处理方式与200 OK一样。
401 Unauthorized:需要进行用户认证或者认证失败。
403 Forbidden:对于指定资源的访问被服务器拒绝了。服务器可以在响应报文的主体部分对原因进行描述。
404 Not Found:服务器找不到请求的资源,或者服务器拒绝请求且不想说明理由。
5XX 服务端错误
500 Internal Server Error:服务端执行请求时发生错误。
503 Service Unavailable:服务器超负荷或者停机维护,无法处理请求。可以在响应的首部写入Retry-After字段返回给客户端说明时间。
通信转发机制
客户端和服务端往往不是直接通信的,需要经过一定的转发。转发包括三种,代理、网关和隧道。
代理
代理服务器负责转发请求和响应,并不会改变URI,直接发送给拥有资源的源服务器。每次通过代理服务器转发请求或者响应的时候,会追加写入via字段标记经过的主机信息。
使用代理服务器可以实现几种功能:缓存、访问控制、访问日志等。
代理的分类:
缓存代理会事先将资源等副本缓存到代理服务器上,下次如果有相同资源的请求,就可以不从源服务器获取,直接返回之前保存的缓存。可以节省通信流量和通信时间。缓存不仅可以保存在服务器中,还可以保存在客户端浏览器中,即临时网络文件Internet Temporary File。
透明代理指的是转发请求或响应时不对报文进行任何处理,不透明代理反之。
网关
网关和代理的工作机制十分相似,不过网关可以和非HTTP服务器进行交互,还可以在网关和客户端的通信线路上加密以确保连接安全。
隧道
隧道可以使客户端和长距离的服务端进行安全通讯,使用SSL等加密方式进行加密,隧道本身并不会解析HTTP请求,直接发送原请求给服务器。