《计算机网络——自顶向下方法》笔记及HTTP抓包实验

  • 应用程序体系结构:CS结构(很常见)和P2P结构(BitTorrent等等)
  • 在操作系统的术语中,进行通信的实际上是进程,一个进程可以被认为是运行在端系统中的一个程序
  • 在P2P文件共享系统中,一个进程的确既能上载文件又能下载文件。
  • 进程通过Socket通信,一个应用开发者对于运输层的控制仅限于1.选择运输层协议 2.设定几个传输层参数

Web和HTTP

  • 在JavaWeb中一个请求就新建一个request
  • Web的应用层协议是HTTP
  • Web服务器实现了HTTP的服务器端,它用于存储Web对象,每个对象由URL寻址
  • HTTP使用TCP作为它的支撑运输协议
  • HTTP是无状态的,服务器向客户发送被请求的文件,而不存储任何关于该客户的状态信息
  • 长连接和短连接:HTTP是基于TCP的,但也是无状态的
    • 短连接:每次连接都是一次新的TCP请求,RTT较大和连接的建立维护消耗较大
    • 长连接(默认):单次HTTP请求服务器在发送响应后保持该TCP连接,后续的请求和像一个你能够通过相同的连接传输
  • 流水线操作(pipeline):类似于在HTTP上实现窗口,从前发送请求后要得到ACK才可以收到响应,使用流水线技术后,可以并行发送请求。比如请求一个包含10张照片的HTML Web页面,与多次请求ACK相比,用长连接可以让请求更快结束,使用了流水线技术后更快。

HTTP报文格式

  • HTTP请求报文:
    • 请求首部行:格式:请求方法 URL HTTP版本,比如GET url HTTP/1.1
    • 方法还有GET、POST、PUT、DELETE
    • 首部行中有 Connection: close 告诉服务器使用短连接
    • PS!!!:Content-Length字段是实体中的字节数(对于HTML文件,由于是直接传源代码文本过去,因此空格和注释都会包含在内),指示HTTP解析,如果长度不对会解析错误
    • HTTP请求报文
    • 当使用GET时请求体为空(请求参数直接写在URL中),当POST时Web页面的内容依赖于用户在表单字段输入的内容
  • HTTP响应报文
    • Content-Type: text/html指明报文体中的对象是HTML文本
  • Cookie:Web站点识别用户的一种典型方式,允许站点对用户进行跟踪
    • 4个组件:
      1. HTTP响应报文中一个cookie首部行,表示服务器分发给用户的
      2. HTTP请求报文中一个cookie首部行,用户请求时附上的
      3. 用户端系统保留一个cookie文件,并由用户的浏览器管理
      4. 位于Web服务器的后段数据库
    • 实现实例:
      1. 在数据库中有一张Cookie表,用来绑定用户和Cookie状态,并管理cookie的过期状态
      2. Tomcat使用HttpSession机制,在Catalina中Session由Session管理器组件统一管理,当服务器收到请求时,如果没有cookie则新建session对象,并将sessionid作为cookie返回,如果有cookie,通过sessionid找到上一次的session(就像map一样),表现起来就像request和session绑定一样(request().getSession())

Web缓存

  • 使用Web的两个原因:
    1. Web缓存器可以大大减少对客户请求的响应时间
    2. 能够减少一个机构的接入链路到因特网的通信量

TCP

  • 序号是表示报文段首字节的字节流编号(可以理解是这次发送的数据在大有效数据报中的位置),序号是建立在传送的字节流之上,而不是建立在传送的报文段的序列上
  • 确认号:成功收到的报文段的序号+1,表示成功收到且期待的在一个SEQ
  • 每个方向都有一组(序列号,确认号),比如C/S下,C->S的字节流有一个序列号,靠S端返回的ACK来推进;S->C的字节流有一个序列号,靠C端返回的ACK来推进
    《计算机网络——自顶向下方法》笔记及HTTP抓包实验_第1张图片

wireshark实验

  • 访问http://gaia.cs.umass.edu/wireshark-labs/HTTP-wireshark-file1.html,抓包观察整个流程

  • 流程(使用了短链接):

    • 先TCP三次握手,握手期间不传数据;后面的就是传输数据了
    • 客户端发送HTTP请求(259Byte,SEQ=1)
    • 服务端返回ACK(ACK=260,SEQ=1)
    • 服务端发送HTTP响应报文(449BYTE,ACK=260)
    • 客户端返回ACK(SEQ=260,ACK=450)
    • 四次挥手
  • 请求
    《计算机网络——自顶向下方法》笔记及HTTP抓包实验_第2张图片

  • 抓包结果
    《计算机网络——自顶向下方法》笔记及HTTP抓包实验_第3张图片

启发

  • HTTP只是基于TCP的一个应用层的协议,对于TCP而言,只是一段字节流,具体的字节怎么解析,依赖于具体的HTTP解析程序(属于应用层)

思考题

  • 为什么需要三次握手?:在服务器ACK客户的SYN报文后,为了防止客户端突然宕机或者SYN泛洪攻击(发送多个SYN报文)导致服务器白白浪费连接资源,服务器会打开一个半连接(相较于全连接而言),发送ACK的同时附带上自身的SYN报文,直到再次收到客户端对这个SYN报文的的ACK后才打开全连接,否则半连接会在等待一定时间后关闭。
  • 为什么需要四次挥手?
    • FIN_WAIT1:这个状态和FIN_WAIT2真正含义是在等待对方的FIN报文,前者实际上只是表示关闭连接的欲望
    • FIN_WAIT2:到这个状态时Socket表示半连接,但还能接收剩余的数据
    • CLOSE_WAIT:这个状态表示还需要再看看有没有剩余的数据,直到没有才正式关闭SOCKET,最后等待对方的ACK报文,当收到后就可以编程CLOSE_WAIT状态了

你可能感兴趣的:(网络)