第一章 浏览器生成消息

一.对url进行解析。url的格式:协议+域名+端口号+数据源(文件)的路径名。

二.生成http消息。 1.http协议定义了客户端和服务器之间交互的额消息内容和步骤。客户端向服务器发送请求小时。请求消息包含的内容是“对什么”(URI)和”进行怎样的操作”(方法) (GET, POST, HEAD, OPTIONS, PUT, DELETE, TRACE, CONNECT)。服务器收到消息后,通过uri和方法来完成自己的工作,然后将结果放在响应消息中。响应信息的开头有一个状态码。客户端收到响应消息,浏览器从中读出数据并显示出来。 2.请求消息和响应消息的格式: < 方法(get,post…)><空格><URI><空格><http版本> //请求行 <头字段名字>:<字段值> //消息头 …… <空行> <消息体> 3.http中主要的头字段(通用头(适用于请求和响应消息的头字段),请求头(用于请求消息),响应头(用于响应消息),实体头(用于消息体))。 4.一条请求消息中只能写一个URI。如果需要获取多个文件,必须对每个文件单独发送一条请求。

三.向dns服务器查询web服务器的ip地址。 1.ip地址的分类。 IP地址根据网络号和主机号来分,分为A、B、 C三类及特殊地址D、E。全0和全1的都保留不用。 A类:(1.0.0.0-126.0.0.0)(默认子网掩码:255.0.0.0或 0xFF000000)第一个字节为网络号,后三个字节为主机号。该类IP地址的最前面为“0”,所以地址的网络号取值于1~126之间。一般用于大型网络。 B类:(128.0.0.0-191.255.0.0)(默认子网掩码:255.255.0.0或0xFFFF0000)前两个字节为网络号,后两个字节为主机号。该类IP地址的最前面为“ 10”,所以地址的网络号取值于128~191之间。一般用于中等规模网络。 C类:(192.0.0.0-223.255.255.0)(子网掩码:255.255.255.0或 0xFFFFFF00)前三个字节为网络号,最后一个字节为主机号。该类IP地址的最前面为“110”,所以地址的网络号取值于192~223之间。一般用于小型网络。 D类:是多播地址。该类IP地址的最前面为“1110”,所以地址的网络号取值于224~239之间。一般用于多路广播用户。 E类:是保留地址。该类IP地址的最前面为“1111”,所以地址的网络号取值于240~255之间。 在IP地址3种主要类型里,各保留了3个区域作为私有地址,其地址范围如下: A类地址:10.0.0.0~10.255.255.255 B类地址:172.16.0.0~172.31.255.255 C类地址:192.168.0.0~192.168.255.255 回送地址:127.0.0.1。 也是本机地址,等效于localhost或本机IP。一般用于测试使用。例如:ping 127.0.0.1来测试本机TCP/IP是否正常。 2.通过操作系统的socket库中的解析器(dns客户端)向dns服务器发出查询。 <内存地址> = gethostbyname(“www.lab.glasscom.com”); 3.解析器(gethostbyname)的工作流程。 生成发送给dns服务器的查询消息; 向dns服务器发送查询消息; 接收dns服务器返回的响应消息; 从响应消息中取出ip地址,存放到<内存地址>中; 返回应用程序;

四.全世界的dns服务器大接力。 1.域名的层次结构(略)。

五.委托协议栈发送消息。 分为以下阶段:创建套接字;将管道连接到服务器的套接字上(连接阶段);收发数据(通信阶段);断开管道并删除套接字(断开阶段); 1.创建套接字。 <描述符>=socket(<使用ipv4>,<流模式>,……) 描述符是用来识别出某个特定的套接字,协议栈可以根据描述符找到对应的套接字。 2.连接阶段。 connect(<描述符>,<服务器ip地址和端口号>,…..) ip地址和端口号是客户端和服务器之间用来识别对方套接字的机制。 描述符是应用程序用来识别套接字的机制。 3.通信阶段。 write(<描述符>,<发送数据>,<发送数据长度>,……); 接收数据长度=read(<描述符>,<接收缓冲区>,……); 4.断开阶段。 close(<描述符>); 六.在http1.1版本中可以在一次连接中收发多个请求和响应。

第二章 用电信号传输tcp/ip数据 一.创建套接字。 1.协议栈的内部结构如下。 2.套接字的实体就是通信控制信息。 在创建套接字过程中,协议栈会分配用于存放一个套接字所需的内存空间,用于记录套接字控制信息。通信控制信息包括通信对象的IP地址,端口号,通信操作的进行状态,记录是否已经收到响应,以及发送数据后经过多长时间等。

二.连接服务器。 1.连接实际上是通信双方交换控制信息。 2.连接需要分配一块用来临时存放要收发的数据的内存空间(缓冲区)。 3.控制信息分为2类:1.头部中记录的信息。2.套接字(协议栈中的内存空间)中记录的信息。 4.tcp的头部格式如下 。 5.tcp连接过程为3次握手。

三.收发数据。 1.MTU与MSS。MTU是一个网络包的最大长度,以太网中一般为1500字节。MSS是除去头部之后,一个网络包所能容纳的TCP数据的最大长度。如果发送的数据超过MSS的长度,发送缓冲区中的数据会被以MSS长度为单位进行拆分,拆分出来的每块数据会被放进单独的网络包中。 2.收到数据的一方使用ACK号确认网络包已收到。这是实现错误重传机制的很重要一个环节。 3.根据网络包平均往返时间调整ACK号等待时间(超时重传的等待时间)。由于网络波动很大,所以一般不将等待时间设置为一个固定值,tcp采用动态调整等待时间的方法。 4.tcp使用滑动窗口有效管理ACK号。在发送一个包之后,不等待ACK号返回,而是直接发送后续的一系列包。 5.ACK号和滑动窗口大小的更新,可以合并为一个包发送,提高效率。

四.从服务器断开并删除套接字。

五.tcp的整体流程。

六.IP与以太网的包收发操作。 1.包的结构是,[MAC头部][IP头部][TCP头部][数据块] 2.包收发操作概览。 2.1 IP模块负责添加如下2个头部:MAC头部(以太网用的头部,包含MAC地址),IP头部(IP用的头部,包含ip地址)。 3. ip头部格式。 4.生成以太网用的mac头部。 5.通过arp查询目标路由器的mac地址。 6.给网络包再加3个控制数据(报头,起始帧分界符,帧校验序列)。 6.1 报头作用是确定包的读取时机。测量电压和电流时必须先判断出每个比特的界限在哪里,对于1和0连续出现的信号,由于电压和电流没有变化,就无法切分每个比特。因此,我们不能一开始就发送包的数据,而是要在前面加上一段用来测量时钟信号的特殊信号,这就是报头。 6.2 起始帧分界符是一个用来表示包起始位置的标记。 6.3 末尾的fcs(帧校验序列)用来检查包传输过程中因噪声导致的波形絮乱,数据错误,它是一串32比特的序列,是通过一个公式对包中从头到尾的所有内容进行计算而得出来的。 7.ICMP消息。客户端计算机不负责对包进行转发,因此不应该收到不是发给自己的包。当发生这样的错误,IP模块会通过ICMP消息将错误告知发送方。 8.IP协议的分片功能。如果接收到的包是经过分片的,那么IP模块会将它们还原成原始包。分片的包会在IP头部的标志字段中进行标记,当收到分片的包时,IP模块会将其暂存在内部的内存空间中,然后等待IP头部中具有相同ID的包全部到达,这是因为同一个包的所有分片都具有相同的ID。此外,IP头部还有一个分片偏移量字段,它表示当前分片在整个包中所处的位置。根据这些信息,在所有分片全部收到之后,就可以将他们还原成原始的包,这个操作叫做分片重组。

七.udp协议。 一般用于数据很短,用一个包就能装的下的情况。udp不需要建立和断开连接的步骤,只要从应用程序获取的数据前面加上udp头部,然后交给IP进行发送就可以了。接收也简单,只要根据ip头部中的接收方和发送方ip地址,以及udp头部中的接收方和发送方端口号,找到相应的套接字并将数据交给响应的应用程序就可以了。

第三章 从网线到网络设备(这一章只做了解,略) 1.将包存入缓冲区后,接下来需要查询一下这个包的接收方MAC地址是否已经在MAC地址表中有记录了。MAC地址表主要包含两个信息,一是设备的MAC地址,另一个是该设备连接在交换机的哪个端口上。 2.通过地址转换有效利用IP地址。对互联网开放的部分分配公有地址,可以和互联网直接进行通信。内部设备则分配私有地址,不能和互联网直接收发网络包,而是通过地址转换的机制进行连接。基本原理是转发网络包时对IP头部中的IP地址和端口号(TCP或UDP的端口号)进行改写。改写前的私有地址和端口号以及改写后的公有地址和端口号,会作为一组对应的记录保存在地址转换设备内部的一张表中。

第四章 通过接入网进入互联网内部(不关心,略)

第五章 服务器端的局域网有什么玄机 一. web服务器可部署在公司或网络运营商管理的数据中心里或者直接租用运营商提供的服务器。

二. 防火墙。基本思路是只允许发往特定服务器中的特定应用程序的包通过,然后屏蔽其他包。防火墙可分为包过滤,应用层网关,电路层网关等几种方式,最为普及的是包过滤方式。包过滤方式的防火墙可根据接收方IP地址,发送方IP地址,接收方端口号,发送方端口号,控制位等信息来判断是否允许某个包通过。

三. 通过将请求平均分配给多台服务器来平衡负载

  1. 实现方式有多种。 1.1 最简单的是通过dns服务器来分配。当访问服务器时,客户端需要先向dns服务器查询服务器的ip地址,如果在dns服务器中填写多个名称相同的记录,则每次查询dns服务器都会按顺序返回不同的IP地址。缺点是不能跳过有故障的web服务器,不能处理跨多个页面的操作。 1.2 使用负载均衡器分配访问。客户端想负载均衡器发送请求,然后由负载均衡器判断将请求转发给哪台web服务器。当操作跨多个页面时,则不考虑web服务器的负载,而是必须将请求发送到同一台服务器上。怎么判断请求之间的相关性?可以在发送表单数据时在里面加上用来表示关联的信息,或是对HTTP规格进行扩展,在HTTP头部字段中加上用来判断相关性的信息(cookie)。这样,负载均衡器就可以通过这些信息来做出判断,将一系列相关的请求发送到同一台web服务器,对于不相关的请求则发送到负载较低的服务器。 四. 使用缓存服务器分担负载
  2. 缓存服务器是一台通过代理机制对数据进行缓存的服务器。代理介于web服务器和客户端之间,具有对web服务器访问进行中转的功能。当进行中转时,它可以将web服务器返回的数据保存在磁盘中,并可以代替web服务器将磁盘中的数据返回给客户端。这种保存的数据称为缓存。
  3. 如果一台缓存服务器对应多台web服务器,就需要根据请求消息的内容来判断应该转发给哪台服务器。要实现这个目标有几种方法,其中有代表性的是根据请求消息的URI中的目录名进行判断。
  4. 正向代理。在客户端一侧设置缓存服务器,就是正向代理。正向代理还有另一个目的是实现防火墙。不过在使用正向代理时,一般需要在浏览器的设置窗口中的“代理服务器”一栏中填写正向代理的IP地址。
  5. 反向代理。在服务器一侧设置缓存服务器。
  6. 透明代理(没怎么看明白,需要之后再百度下)。查看请求消息的包头部(包含接收方IP地址),只要知道接收方的IP,就知道用户要访问哪台服务器。可以在接入网的入口处设置透明代理。 五. 内容分发服务 在互联网中部署很多缓存服务器,并将用户的访问引导到最近的缓存服务器上。 每次web服务器在原始数据发生更新时,立即通知缓存服务器,使得缓存服务器上的数据一直保持最新状态,这样就不需要每次确认原始数据是否有变化,而且从第一次访问就可以发挥缓存的效果。

第六章 请求达到web服务器,响应返回浏览器 一. 服务器概览

  1. 在连接过程中,客户端发起连接操作,而服务器则是等待连接操作。服务器的程序可以同时和多台客户端计算机进行通信。
  2. 服务器程序的结构。分为两个模块,即等待连接模块和负责与客户端通信的模块。当服务器程序启动并读取配置文件完成初始化操作后,就会运行等待连接模块。这个模块会创建套接字,然后进入等待连接的暂停状态。接下来,当客户端发起连接时,这个模块会恢复运行并接受连接,然后启动客户端通信模块,并移交完成连接的套接字。接下来客户端通信模块就会使用已连接的套接字与客户端进行通信,通信结束后,这个模块就退出。
  3. 服务器上可能存在多个端口号相同的套接字,但客户端的套接字都是对应不同端口号的,因此我们可以通过客户端的端口号来确定服务器上的某个套接字。
  4. 使用描述符来指代套接字的原因是等待连接的套接字中没有客户端IP地址和端口号和使用描述符这一种信息比较简单。

二. 服务器的接收操作

  1. 网卡的MAC模块将网络包从信号还原为数字信息,校验FCS并存入缓冲区。网卡驱动会根据MAC头部判断协议类型,并将包交给幸运的协议栈。
  2. 协议栈的IP模块会检查IP头部,首先判断是否发给自己的;判断网络包是否经过分片;将包转交给TCP模块或UDP模块。
  3. 如果收到的是发起连接的包,则TCP模块会确认TCP头部的控制位SYN;检查接收方的端口号;为相应的等待连接套接字复制一个新的副本;记录发送方IP地址和端口号等信息。
  4. 收到数据包时,TCP模块会根据收到的包的发送方IP地址,发送方端口号,接收方IP地址,接收方端口号找到相对应的套接字;将数据块拼合起来并保存在接收缓冲区中;想客户端返回ACK。

三. web服务器程序解析请求消息并做出响应 请求消息包括一个称为”方法”的命令,以及表示数据源的URI,服务器程序会根据这些内容向客户端返回数据,但对于不同的方法和URI,服务器内部的工作过程会有所不同。 1.将请求的URI转换为实际的文件名。 2.运行cgi程序。如果判断要访问的文件为程序文件,web服务器会委托操作系统运行这个程序,然后从请求消息中取出数据并交给运行的程序。 3. web服务器的访问控制。web服务器的访问控制规则主要有3种,客户端的IP地址;客户端域名;用户名和密码。 4. 返回响应消息。

四. 浏览器接收响应消息并显示内容。 消息开头的Content-Type头部字段的值来判断信息的数据类型。 完。