DNS解析返回域名的IP以后,接下来就是浏览器要和该IP创建TCP链接了。为何是TCP而不是UDP?那是由于HTTP是基于TCP上的。这里涉及到另一个话题:TCP/IP 模型。这个已经在大学的课本上学过了,咱们再复习一下。
很少解释,OSI的7/6/5层和TCP/TP的应用层对应,2/1层和链路层对应。在实际的应用中,主要仍是TCP/IP概念模型,后面的内容主要讲它。浏览器
这些都是课本上的,也许忘了(毕竟不是每天用到这些嘛),不要紧,咱们以最简单的方式来说解。为了便于理解每层的含义和做用,先看每层有哪些协议,看看有没有本身熟悉的协议。有熟悉的协议,先体会一下。

应用层
咱们能够看到,有经常使用的HTTP/HTTPS/IMAP/SSH/Telnet等都在应用层上(题外话,这一层你用的协议越多,说明你知识越开阔)。相信每一个人都用过HTTP/HTTPS,因此我上面说HTTP/HTTP是基于TCP上的。
Wikipedia 这么解释:
The
application layer is the scope within which applications create user data and communicate this data to other applications on another or the same host. The applications, or processes, make use of the services provided by the underlying, lower layers, especially the Transport Layer which provides reliable or unreliable pipesto other processes. The communications partners are characterized by the application architecture, such as the
client-server model and
peer-to-peer networking. This is the layer in which all higher level protocols, such as SMTP, FTP, SSH, HTTP, operate. Processes are addressed via ports which essentially represent services.
传输层
没错,最多见的TCP和UDP就在这里,TCP三次握手也在这里。
Wikipedia 这么解释:
The
transport layer performs host-to-host communications on either the same or different hosts and on either the local network or remote networks separated by routers.
[22] It provides a channel for the communication needs of applications. UDP is the basic transport layer protocol, providing an unreliable datagram service. The Transmission Control Protocol provides flow-control, connection establishment, and reliable transmission of data.
IP层
IP层很是重要,可能这么说还不太懂,看看其余协议。你们知道ICMP吗?估计不少人仍是说不上来ICMP是什么东西。你们确定用过ping命令吧,它就是用的ICMP。说到这里,应该有感性的认识了吧。
Wikipedia 这么解释:
The
internet layer exchanges datagrams across network boundaries. It provides a uniform networking interface that hides the actual topology (layout) of the underlying network connections. It is therefore also referred to as the layer that establishes internetworking. Indeed, it defines and establishes the Internet. This layer defines the addressing and routing structures used for the TCP/IP protocol suite. The primary protocol in this scope is the Internet Protocol, which defines IP addresses. Its function in routing is to transport datagrams to the next IP router that has the connectivity to a network closer to the final data destination.
链路层
这个很是底层了,ARP,NDP,Ethernet都很常见,若是认真看过HTTP抓包,熟悉LVS,Ngnix等提供的负载均衡,应该对ARP不陌生,是的ARP用来查找设备的MAC地址,在LVS作负载均衡时会用到,由于进来的stream的包MAC地址要和出去的Stream包的MAC地址保持一致,由于作负载均衡,有可能会变化,如何解决这个问题,则不在本文的讨论范围内,若有兴趣能够参看LVS的文档。
Wikipedia 这么解释:
The
link layer defines the networking methods within the scope of the local network link on which hosts communicate without intervening routers. This layer includes the protocols used to describe the local network topology and the interfaces needed to effect transmission of Internet layer datagrams to next-neighbor hosts.
TCP/IP抓包分析
看了前面的内容,仍是以为抽象吗?若是是,没关系,也在预期内。让咱们抓个包,分析认识一下就清楚了。
看到这里,应该开始有感受了吧。
HTTP,即应用层,正在访问js.aq.qq.com.
TCP层,src port是62957, dst port是80端口,由于js.aq.qq.com的端口是80。
IP层,用的是IPV4,个人计算机IP地址是192.168.1.2,目标IP是180.153.105.248.
链路层, 我使用的是Apple电脑,个人MAC地址我隐藏了,对端是ZTE设备。
再截几个图你们仔细看一下。
链路层
IP层

TCP层
应用层(HTTP)
在这里不加以详解,后面会对TCP以及HTTP层详详细说明。
TCP三次握手与四次挥手
TCP三次握手
所谓三次握手(Three-way Handshake),是指创建一个 TCP 链接时,须要客户端和服务器总共发送3个包。
三次握手的目的是链接服务器指定端口,创建 TCP 链接,并同步链接双方的序列号和确认号,交换 TCP 窗口大小信息。在 socket 编程中,客户端执行 connect() 时。将触发三次握手。
· 第一次握手(SYN=1, seq=x):
客户端发送一个 TCP 的 SYN 标志位置1的包,指明客户端打算链接的服务器的端口,以及初始序号 X,保存在包头的序列号(Sequence Number)字段里。
发送完毕后,客户端进入 SYN_SEND 状态。
· 第二次握手(SYN=1, ACK=1, seq=y, ACKnum=x+1):
服务器发回确认包(ACK)应答。即 SYN 标志位和 ACK 标志位均为1。服务器端选择本身 ISN 序列号,放到 Seq 域里,同时将确认序号(Acknowledgement Number)设置为客户的 ISN 加1,即X+1。 发送完毕后,服务器端进入 SYN_RCVD 状态。
· 第三次握手(ACK=1,ACKnum=y+1)
客户端再次发送确认包(ACK),SYN 标志位为0,ACK 标志位为1,而且把服务器发来 ACK 的序号字段+1,放在肯定字段中发送给对方,而且在数据段放写ISN的+1
发送完毕后,客户端进入 ESTABLISHED 状态,当服务器端接收到这个包时,也进入 ESTABLISHED状态,TCP 握手结束。
三次握手的过程的示意图以下:
确实比较抽象,让咱们继续经过抓包来分析(访问baidu.com)
这里有三个包。
192.168.1.2是我机器的IP,115.239.211.112是baidu的IP,是否是和上图一致。
具体看270包,192.168.1.2 发送SYN到115.239.211.112,seq=0;
以下图:

274包图,115.239.211.112返回SYN 和ACK给192.168.1.2, seq =0, 可是ACK等于SYN里的seq(为0)+1,因此为1

275包图,192.168.1.2收到ACK包后,给115.239.211.112再回一个ACK,ACK#为1:

对于协议的理解,仍是多观察,多比对,就知道是怎么回事了。
TCP四次挥手
TCP 链接的拆除须要发送四个包,所以称为四次挥手(Four-way handshake),也叫作改进的三次握手。客户端或服务器都可主动发起挥手动做,在 socket 编程中,任何一方执行 close() 操做便可产生挥手操做。
· 第一次挥手(FIN=1,seq=x)
假设客户端想要关闭链接,客户端发送一个 FIN 标志位置为1的包,表示本身已经没有数据能够发送了,可是仍然能够接受数据。
发送完毕后,客户端进入 FIN_WAIT_1 状态。
· 第二次挥手(ACK=1,ACKnum=x+1)
服务器端确认客户端的 FIN 包,发送一个确认包,代表本身接受到了客户端关闭链接的请求,但尚未准备好关闭链接。
发送完毕后,服务器端进入 CLOSE_WAIT 状态,客户端接收到这个确认包以后,进入 FIN_WAIT_2 状态,等待服务器端关闭链接。
· 第三次挥手(FIN=1,seq=y)
服务器端准备好关闭链接时,向客户端发送结束链接请求,FIN 置为1。
发送完毕后,服务器端进入 LAST_ACK 状态,等待来自客户端的最后一个ACK。
· 第四次挥手(ACK=1,ACKnum=y+1)
客户端接收到来自服务器端的关闭请求,发送一个确认包,并进入 TIME_WAIT状态,等待可能出现的要求重传的 ACK 包。
服务器端接收到这个确认包以后,关闭链接,进入 CLOSED 状态。
客户端等待了某个固定时间(两个最大段生命周期,2MSL,2 Maximum Segment Lifetime)以后,没有收到服务器端的 ACK ,认为服务器端已经正常关闭链接,因而本身也关闭链接,进入 CLOSED 状态。
四次挥手的示意图以下:

这里就不抓包了,能够自行抓包对比看看。
HTTPS证书
愈来愈多的网站开始使用HTTPS(Apple要求App都须用HTTPS)。对于HTTPS,须要有一个SSL/TLS的鉴权/认证,才能创建TCP连接。
下图描述了HTTP和HTTPS的区别。

借用一张阮一峰老师的图:

咱们仍是抓包体会一下。
对着阮一峰老师图片的流程看:
273包: Client 发送Client Hello给Server。
278包: Server回Server Hello给Client。
283包: Server继续回Server Certificate给Client,要交换证书。
294包:Server继续回Server Key Exchange,交换key。
295包:Server返回Server Hello Done。
截止这里,Server已经作了很多事,接下来轮到Client了。
298包:Client Key Exchange,Change Cipher Spec,Encrypted Handshake Message。到这里就结束了。
咱们再仔细看看Client Hello的273包,注意标记部分.
接下来再看看Extension,有不少对不对。这里专门说一下 SNI(Server Name Indication), server_name, 咱们能够看见它的值是
www.baidu.com. 也就是说浏览器发送过来的证书是给baidu这个域名签发的。SNI用来校验该证书是否是为server name提供的域名签发的。若是不是,就会报错。
有一种状况特别须要注意,在早期版本的浏览器或者HTTP客户端,SNI可能不包含在该包里的,那么怎么处理呢?若是Server端只有一个证书部署,那简单,就是按照部署的那个证书去判断。若是有多个证书部署呢?好比部署了aaa.com bbb.com ccc.com 三个域名的证书,那么就会按照缺省的去匹配,取决于软件(Apache,Tomcat等)和硬件(F5,Netscaler)怎么配置了。
可是若是已经商用,去改默认配置,会对商用服务有影响,那么可不能够在Client有一些改进呢?若是您正在使用某个HTTP library,能够考虑升级版本是否支持。
278包的Server Hello

继续看看Server Certificate,即283包
咱们看看baidu的证书,打开Chrome就能够看到了,对比一下两图的基本信息,这时是否是以为更容易理解?我相信答案是确定的。
294包,Server key Exchange
295包,Server Hello Done。
298包,Client Key Exchange/Change Cipher Spec/Encrypted Handshake Message。

TCP/IP其余
上面都是最基本的东西,在实际的过程当中还有包重试,包拼装等,太底层了,你们有兴趣能够找资料看看。
TCP/IP 10问
如下几个问题大部分均可以找到答案。
- TCP/IP的4层模型了解吗?每层有哪些常见协议?
- TCP/IP的三次握手了解吗?四次挥手是什么,了解多少?
- HTTP和HTTPS在TCP握手上有什么不一样?SSL/TLS握手流程了解吗?
- SSL/TLS的版本有哪些?当前浏览器支持哪些版本?
- SNI了解多少?若是SNI没有,该如何校验证书?
- TCP与UDP区别在哪里?
- 为何TCP常常会组装包?如何保证包的完整性?
- TCP滑动窗口原理是什么?TCP有哪些状态?
- MAC地址的是如何定义的?(这个问题太Edge了)
- SSL/TLS证书和端口有关系吗?为何?
今天把TCP/IP, SSL/TLS介绍完了,下一部分是最后一部份了,左右介绍HTTP和Broswer的机制。服务器