不同端系统上的进程通过跨越计算机网络交换报文而相互通信,在给定的一对进程之间的通信会话中,发起通信的进程被标示为客户机,在会话开始时等待联系的进程标示为服务器

进程通过一个称为套接字(socket)的软件接口在网络上发送和接收报文。

进程、套接字

套接字也是应用程序与网络之间的应用程序编程接口(API)

发送进程通过端口号来识别运行在主机上的接收进程,端口号介于0~65535之间。

超文本传输协议HTTP

HTTP使用TCP作为支撑它的传输层协议

  • HTTP客户机进程在端口80发起一个到服务器jemoii.github.io的TCP连接,客户机和服务器上分别有一个套接字与该连接相关联

  • HTTP客户机经它的套接字向服务器发送一个HTTP请求报文

    1
    2
    3
    4
    5
    GET /blog/application-layer/ HTTP/1.1 #请求行
    Host: jemoii.github.io #主机
    Connection: keep-alive
    User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36
    Accept-Language: zh-CN,zh;q=0.8
  • 请求行中的方法字段可以为,GET,POST,HEAD,PUT和DELETE。
  • HTTP服务器经它的套接字接收该请求报文,检索相应对象,封装在HTTP响应报文,并通过其套接字向客户机发送响应报文
    1
    2
    3
    4
    5
    6
    7
    8
    HTTP/1.1 200 OK #状态行
    Server: GitHub.com
    Content-Type: text/html; charset=utf-8
    Last-Modified: Sun, 01 Feb 2015 13:12:59 GMT
    Content-Length: 3472 #被发送对象的字节数
    Date: Sat, 07 Mar 2015 09:05:00 GMT #发送响应报文的时间
    Connection: keep-alive
    ##### 实体主体
  • 状态行中的状态码和相关短语
    • 200 OK
    • 404 NOT Found
    • 505 HTTP Version NOT Supported
  • HTTP客户机接收响应报文,提取封装的HTML文件
代理服务器

配置浏览器指向代理服务器,若代理服务器缓存了请求对象,作为服务器,接收浏览器的请求并发回响应;若代理服务器未缓存请求对象,作为服务器,接收浏览器的请求后,再作为客户机,向初始服务器发出请求并接收响应,代理服务器在本地存储一份拷贝后,向浏览器发回响应。

代理服务器检查初始服务器中的相应请求对象是否更新

  • 代理服务器的请求报文

    1
    2
    3
    4
    GET /blog/application-layer/ HTTP/1.1
    Host: jemoii.github.io
    If-modified-since: Sun, 01 Feb 2015 13:12:59 GMT
    #上次初始服务器发送响应报文中的Last-Modified
  • 初始服务器的响应报文

    1
    2
    3
    4
    HTTP/1.1 304 Not Modified
    Server: GitHub.com
    Date: Sat, 07 Mar 2015 09:05:00 GMT
    ##### 实体为空