# 第1章 了解Web及网络基础
# 1. TCP/IP协议族按层次分为4层
应用层、传输层、网络层和数据链路层。
- 应用层决定了向用户提供应用服务时通信的活动。比如FTP(文件传输协议)和DNS(域名系统)。HTTP协议也处于该层。
- 传输层提供处于网络连接中的两台计算机之间的数据传输。在传输层有两个性质不同的协议:TCP(传输控制协议)和UDP(用户数据报协议)。
- 网络层用来处理在网络上流动的数据包。
- 数据链路层用来处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱动、NIC(网卡)、光纤等。
# 2. TCP/IP通信传输流
发送端从应用层往下走,接收端则从链路层往上走。
首先作为发送端的客户端在应用层(HTTP协议)发出一个想看某个Web页面的请求。为了传输方便,在传输层(TCP协议)把应用层处收到的数据进行分割,并在各个报文上打上标记序号及端口号后转发给网络层。在网络层(IP协议),增加作为通信目的地的MAC地址后转发给链路层。接收端的服务器在链路层接收到数据,按顺序往上层发送,一直到应用层。这时接收端接收到客户端发送的数据。
发送端在层与层之间传输数据时,每经过一层时必定会被打上一个该层所属的首部信息。接收端在层与层传输数据时,每经过一层时会把对应的首部消去。
# 3. 与HTTP关系密切的协议:IP、TCP、DNS
# 3.1 负责传输的IP协议
IP网际协议位于网络层。IP协议的作用是把各种数据包传输给对方。
而要保障确实传送到对方那里,其中两个重要的条件是IP地址和MAC地址。IP地址可以和MAC地址进行配对。
使用ARP协议凭借MAC地址进行通信
IP间的通信依赖MAC地址。在网络上通信的双方在同一局域网内的情况很少,通常是经过多台计算机和网络设备中转才能连接到对方。而在进行中转时,会利用下一站的MAC地址来搜索下一个中转目标。这时,会采用ARP协议。
ARP协议是一种用于解析地址的协议,根据通信方的IP地址就可以反查出对应的MAC地址。
# 3.2 确保可靠性的TCP协议
TCP位于传输层,提供可靠的字节流服务。 字节流服务指,为了方便传输将大块数据分割成以报文段位单位的数据包进行管理。
TCP协议为了更容易传送大数据才把数据分割,而且TCP协议能够确认数据最终是否送达到对方。
# 确保数据能到达目标(三次握手)
TCP采用了三次握手策略。握手过程使用了TCP的标志-SYN(synchronize)和ACK(acknowledgement)。
发送端首先发送一个带SYN标志的数据包给对方。接收端收到后,回传一个带有SYN/ACK标志的数据包以示传达确认信息。最后,发送端再回传一个带ACK标志的数据包,代表握手结束。
若握手过程莫名中断,TCP协议会再次以相同的顺序发送相同的数据包。
三次握手的本质是确认通信双方收发数据的能力
首先,我让信使运输一份信件给对方,对方收到了,那么他就知道了我的发件能力和他的收件能力是可以的。
于是他给我回信,我若收到了,我便知我的发件能力和他的收件能力是可以的,并且他的发件能力和我的收件能力是可以。
然而此时他还不知道他的发件能力和我的收件能力到底可不可以,于是我最后回馈一次,他若收到了,他便清楚了他的发件能力和我的收件能力是可以的。
- 第一次握手:客户端要向服务端发起连接请求,首先客户端随机生成一个起始序列号ISN(比如是100),那客户端向服务端发送的报文段包含SYN标志位(也就是SYN=1),序列号seq=100。
- 第二次握手:服务端收到客户端发过来的报文后,发现SYN=1,知道这是一个连接请求,于是将客户端的起始序列号100存起来,并且随机生成一个服务端的起始序列号(比如是300)。然后给客户端回复一段报文,回复报文包含SYN和ACK标志(也就是SYN=1,ACK=1)、序列号seq=300、确认号ack=101(客户端发过来的序列号+1)。
- 第三次握手:客户端收到服务端的回复后发现ACK=1并且ack=101,于是知道服务端已经收到了序列号为100的那段报文;同时发现SYN=1,知道了服务端同意了这次连接,于是就将服务端的序列号300给存下来。然后客户端再回复一段报文给服务端,报文包含ACK标志位(ACK=1)、ack=301(服务端序列号+1)、seq=101(第一次握手时发送报文是占据一个序列号的,所以这次seq就从101开始,需要注意的是不携带数据的ACK报文是不占据序列号的,所以后面第一次正式发送数据时seq还是101)。当服务端收到报文后发现ACK=1并且ack=301,就知道客户端收到序列号为300的报文了,就这样客户端和服务端通过TCP建立了连接。
# 四次挥手
四次挥手的目的是关闭一个连接
比如客户端初始化的序列号ISA=100,服务端初始化的序列号ISA=300。TCP连接成功后客户端总共发送了1000个字节的数据,服务端在客户端发FIN报文前总共回复了2000个字节的数据。
- 第一次挥手:当客户端的数据都传输完成后,客户端向服务端发出连接释放报文(当然数据没发完时也可以发送连接释放报文并停止发送数据),释放连接报文包含FIN标志位(FIN=1)、序列号seq=1101(100+1+1000,其中的1是建立连接时占的一个序列号)。需要注意的是客户端发出FIN报文段后只是不能发数据了,但是还可以正常收数据;另外FIN报文段即使不携带数据也要占据一个序列号。
- 第二次挥手:服务端收到客户端发的FIN报文后给客户端回复确认报文,确认报文包含ACK标志位(ACK=1)、确认号ack=1102(客户端FIN报文序列号1101+1)、序列号seq=2300(300+2000)。此时服务端处于关闭等待状态,而不是立马给客户端发FIN报文,这个状态还要持续一段时间,因为服务端可能还有数据没发完。
- 第三次挥手:服务端将最后数据(比如50个字节)发送完毕后就向客户端发出连接释放报文,报文包含FIN和ACK标志位(FIN=1,ACK=1)、确认号和第二次挥手一样ack=1102、序列号seq=2350(2300+50)。
- 第四次挥手:客户端收到服务端发的FIN报文后,向服务端发出确认报文,确认报文包含ACK标志位(ACK=1)、确认号ack=2351、序列号seq=1102。注意客户端发出确认报文后不是立马释放TCP连接,而是要经过2MSL(最长报文段寿命的2倍时长)后才释放TCP连接。而服务端一旦收到客户端发出的确认报文就会立马释放TCP连接,所以服务端结束TCP连接的时间要比客户端早一些。
# 3.3 负责域名解析的DNS服务
DNS(Domain Name System)服务是和HTTP协议一样位于应用层的协议。它提供域名到IP地址间的解析服务。
为什么会有域名而不是直接使用IP,这样就不会用到DNS了?
因为用字母配合数字的表示形式来制定计算机名更符合人类记忆的习惯。但是计算机很难处理这种。所以DNS就出现了。
# 4. URI和URL
URL是使用Web浏览器等访问Web页面时需要输入的网页地址。如http://hack.jp/
URI就是由某个协议方案表示的资源的定位标识符,如ftp://ftp.is/xx.text,http://www.ids.org。采用HTTP协议是,协议方案就是http。还有ftp、telnet、file等。
URI用字符串标识某一互联网资源,而URL表示资源的地点(互联网上所处的位置)。可见URL是URI的子集。