TCP/IP学习笔记:HTTP

报文格式

请求报文

1
2
3
4
5
GET /somedir/page.html HTTP/1.1
Host: www.someschool.edu
Connection: close
User-agent: Mozilla/5.0
Accept-language: fr

第一行叫做请求行,其后继的行叫做首部行。首部行中,冒号左边的称为首部字段名,右边称为值。

  • 请求行

    • 方法字段
      • GET:浏览器请求一个对象。
      • POST:当用户提交表单时,HTTP客户常使用POST方法,表单中的值存放在实体体中。
      • HEAD:类似于GET方法,当服务器收到一个HEAD请求时,将对用一个HTTP报文进行响应,但是不返回请求对象
      • PUT:用户上传对象到指定的Web服务器上的指定路径(目录)。
      • DELETE:用户或应用程序删除Web服务器上的对象。
    • URL字段:例子中的/somedir/page.html
    • 版本字段:例子中的HTTP/1.1
  • 首部行

    • Host:指明对象所在的主机。
    • Connection: close告诉服务器不要使用持续连接,它要求服务器在发送完被请求的对象后就关闭这条连接。
    • User-agent:指明用户代理,即向服务器发送请求的浏览器类型。这里的Mozilla/5.0就是Firefox浏览器。
    • Accept-language:用户想得到的对象的语言,如这里的Fr即指法语版本。若服务器中没有这样的对象,那么服务器应当发送它的默认版本。
    • If-modified-since:(条件GET方法)若服务器上的对象在此日期之后被修改,服务器才会传回新对象,否则服务器返回304 Not Modified。这个日期通常来源于之前请求时得到的响应报文中的Last-modified首部行。
    • cookie:本机对应本站点的cookie。
  • 实体体(可以不存在)

    ​ 如上所述,实体体通常含通过POST方法发送的表单信息。

一个HTTP请求报文的通用格式为:

1
2
3
4
5
6
7
<方法> <URL> <版本>\r\n
<首部字段名:> <值>\r\n
<首部字段名:> <值>\r\n
...
<首部字段名:> <值>\r\n
\r\n
<实体体>

响应报文

下面这个报文可以是对上述请求报文例子的回应。

1
2
3
4
5
6
7
8
HTTP/1.1 200 OK
Connection: close
Date: Tue, 18 Aug 2015 15:44:04 GMT
Server: Apache/2.2.3 (CentOS)
Last-Modified: Tue, 18 Aug 2015, 15:11:03 GMT
Content-Length: 6821
Content-Type: text/html
(data data data data data ...)

这个例子中,第1行称为状态行,第2-7行称为首部行,接下来是实体体。实体体部分是报文的主要部分,它包含了所请求的对象本身(表示为data data data data data ...)。

  • 状态行

    • 协议版本字段(HTTP/1.1

    • 状态码(200

      常见的状态码:

      状态码&短语 含义
      200 OK 请求成功,信息在返回的响应报文中。
      301 Moved Permanently 请求的对象已经被永久转移,新的URL定义在响应报文的Location首部行中。客户软件将自动获取新的URL。
      304 Not Modified 告诉缓存器可以使用原有对象。
      400 Bad Request 一个通用差错代码,指示该请求不能被服务器理解。
      404 Not Found 被请求的文档不在服务器上。
      505 HTTP Version Not Supported 服务器不支持请求报文使用的HTTP协议版本。
    • 相应状态信息(OK

  • 首部行

    • Connection: close告诉客户发送完报文后将关闭该TCP连接。
    • Date:服务器产生并发送该响应报文的日期和时间。(不是对象创建或最后修改的时间,而是服务器从它的文件系统中检索到该对象,将该对象插入响应报文,并发送该响应报文的时间)
    • Server:生成该报文的服务器信息。(与请求报文中的User-agent对应)
    • Last-Modified:对象创建或最后修改的日期和时间。(对对象缓存很重要)
    • Content-Length:被发送对象的字节数。
    • Content-Type:对象类型。这里对象类型是HTML文本。(对象类型应该正式地由Content-Type首部行而不是用文件扩展名来指示)
    • Set-cookie:设置cookie。
  • 实体体(可以不存在)

    ​ 含有对象内容。

参考资料

《计算机网络:自顶向下方法(原书第7版)》P64-75

Valgrind安装与memcheck简单使用

安装 valgrind

sudo apt install valgrind

安装后,查看一下版本以确认安装成功

valgrind --version

输出形如以下版本号信息就表示安装成功

1
valgrind-3.11.0

使用 memcheck 检查内存泄漏

memleak.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class A {
public:
A() {
a_arr = new int[5];
}
~A() {
delete[] a_arr;
}

private:
int* a_arr;
};

class B : public A {
public:
B() {
b_arr = new int[3];
}
~B() {
delete[] b_arr;
}

private:
int* b_arr;
};

int main() {
A* pa = new B();
delete pa;
return 0;
}
1
2
g++ -g memleak.cpp -o memleak
valgrind --tool=memcheck ./memleak

其中 --tool=memcheck 可以省略,因为 valgrind 的默认工具就是 memcheck
可以检查出类B对象中的12个字节(3个int)内存泄漏(见下方 definitely lost ):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
==7661== Memcheck, a memory error detector
==7661== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==7661== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==7661== Command: ./memleak
==7661==
==7661==
==7661== HEAP SUMMARY:
==7661== in use at exit: 72,716 bytes in 2 blocks
==7661== total heap usage: 4 allocs, 2 frees, 72,752 bytes allocated
==7661==
==7661== LEAK SUMMARY:
==7661== definitely lost: 12 bytes in 1 blocks
==7661== indirectly lost: 0 bytes in 0 blocks
==7661== possibly lost: 0 bytes in 0 blocks
==7661== still reachable: 72,704 bytes in 1 blocks
==7661== suppressed: 0 bytes in 0 blocks
==7661== Rerun with --leak-check=full to see details of leaked memory
==7661==
==7661== For counts of detected and suppressed errors, rerun with: -v
==7661== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

操作系统——设备管理与链接

设备管理

磁盘结构

  • 盘面(Platter):一个磁盘有多个盘面;
  • 磁道(Track):盘面上的圆形带状区域,一个盘面可以有多个磁道;
  • 扇区(Track Sector):磁道上的一个弧段,一个磁道可以有多个扇区,它是最小的物理储存单位,目前主要有 512 bytes 与 4 K 两种大小;
  • 磁头(Head):与盘面非常接近,能够将盘面上的磁场转换为电信号(读),或者将电信号转换为盘面的磁场(写);
  • 制动手臂(Actuator arm):用于在磁道之间移动磁头;
  • 主轴(Spindle):使整个盘面转动。

操作系统——死锁与内存管理

死锁

必要条件

  • 互斥:每个资源要么已经分配给了一个进程,要么就是可用的。
  • 占有和等待:已经得到了某个资源的进程可以再请求新的资源。
  • 不可抢占:已经分配给一个进程的资源不能强制性地被抢占,它只能被占有它的进程显式地释放。
  • 环路等待:有两个或者两个以上的进程组成一条环路,该环路中的每个进程都在等待下一个进程所占有的资源。

处理方法

主要有以下四种方法:

  • 鸵鸟策略
  • 死锁检测与死锁恢复
  • 死锁预防
  • 死锁避免

鸵鸟策略

把头埋在沙子里,假装根本没发生问题

因为解决死锁问题的代价很高,因此鸵鸟策略这种不采取任务措施的方案会获得更高的性能。

当发生死锁时不会对用户造成多大影响,或发生死锁的概率很低,可以采用鸵鸟策略。

大多数操作系统,包括 Unix,Linux 和 Windows,处理死锁问题的办法仅仅是忽略它。

死锁检测与死锁恢复

不试图阻止死锁,而是当检测到死锁发生时,采取措施进行恢复。

1. 每种类型一个资源的死锁检测

上图为资源分配图,其中方框表示资源,圆圈表示进程。资源指向进程表示该资源已经分配给该进程,进程指向资源表示进程请求获取该资源。

图 a 可以抽取出环,如图 b,它满足了环路等待条件,因此会发生死锁。

每种类型一个资源的死锁检测算法是通过检测有向图是否存在环来实现,从一个节点出发进行深度优先搜索,对访问过的节点进行标记,如果访问了已经标记的节点,就表示有向图存在环,也就是检测到死锁的发生。

操作系统——进程管理

进程与线程

概念

进程是资源分配的基本单位;线程是独立调度的基本单位。

一个进程中可以有多个线程,它们共享进程资源。

QQ 和浏览器是两个进程,浏览器进程里面有很多线程,例如 HTTP 请求线程、事件响应线程、渲染线程等等,线程的并发执行使得在浏览器中点击一个新链接从而发起 HTTP 请求时,浏览器还可以响应用户的其它事件。

区别

Ⅰ 拥有资源

进程是资源分配的基本单位,但是线程不拥有资源,线程可以访问隶属进程的资源。

Ⅱ 调度

线程是独立调度的基本单位,在同一进程中,线程的切换不会引起进程切换,从一个进程中的线程切换到另一个进程中的线程时,会引起进程切换。

Ⅲ 系统开销

由于创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O 设备等,所付出的开销远大于创建或撤销线程时的开销。类似地,在进行进程切换时,涉及当前执行进程 CPU 环境的保存及新调度进程 CPU 环境的设置,而线程切换时只需保存和设置少量寄存器内容,开销很小。

Ⅳ 通信方面

线程间可以通过直接读写同一进程中的数据进行通信,但是进程通信需要借助 IPC(Inter-Process Communication,进程间通信,提供了各种进程间通信的方法)。

进程状态

进程的3种基本状态(三态模型)

  1. 就绪态:进程已获得除CPU外的所有必要资源,只等待CPU时的状态。一个系统会将多个处于就绪状态的进程排成一个就绪队列。

  2. 执行态:进程已获CPU,正在执行。单处理机系统中,处于执行状态的进程只一个;多处理机系统中,有多个处于执行状态的进程。

  3. 阻塞态:又称等待状态或封锁状态,正在执行的进程由于某种原因而暂时无法继续执行,便放弃处理机而处于暂停状态,即进程执行受阻。(通常导致进程阻塞的典型事件有:请求I/O,申请缓冲空间等。一般,将处于阻塞状态的进程排成一个队列,有的系统还根据阻塞原因不同把这些阻塞集成排成多个队列。)

进程的5种状态(五态模型)

  1. 新建态:此时,进程已经拥有了字节的PCB,但该进程所必需的资源或其它信息(如主存资源)尚未分配,进程自身还未进入主存,即创建工作尚未完成,进程还不能够被调度运行。(创建进程的两个步骤: 为一个新进程创建PCB,并填写必要管理信息;把该进程转入就绪状态并插入就绪队列。)

  2. 就绪态

  3. 执行态

  4. 阻塞态

  5. 终止态:进程的终止首先要等待操作系统进行善后处理,然后将其PCB清零,并将PCB空间返还系统。(当一个进程到达自然结束点或出现了无法克服的错误,或是被操作系统或其它有终止权的进程所终结,它将进入终止状态。进入终止状态的进程不能再执行,但在操作系统中依然保留一个记录,其中保存状态码和一些计时统计数据,供其它进程收集。一旦其它进程完成了对终止状态进程的信息提取之后,操作系统将删除该进程。)

进程调度算法

不同环境的调度算法目标不同,因此需要针对不同环境来讨论调度算法。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×