参考文章:
- https://www.jianshu.com/p/a9142a4d084f
- https://www.cnblogs.com/xuzekun/p/7527736.html
- https://segmentfault.com/a/1190000006879700
- https://blog.csdn.net/qzcsu/article/details/72861891
- https://www.jianshu.com/p/7c8b4576e4bb
- https://blog.csdn.net/qq_22238021/article/details/81197157
在浏览器输入 www.baidu.com 按下回车究竟会发生什么呢?
过程概述
- 浏览器对 www.baidu.com 这个域名进行DNS域名解析,获得对应的IP地址。
- 通过IP地址找到对应的服务器,发起TCP三次握手。
- 基于TCP连接,发送HTTP请求。
- 服务器响应请求,并且返回html代码。
- 浏览器解析html的代码,并且请求静态资源(如:js、css、img等)。
- 浏览器将渲染的页面呈现给用户。
过程细节
1. DNS域名解析:
-
浏览器会搜索请求自身DNS缓存,寻找有没有对应的IP地址
-
如果没有找到,则会搜索系统自身的DNS缓存
-
如果没有找到,会搜索系统中host文件
-
如果上述三种方法都没有找到对应的IP地址,就会进行递归去域名服务器进行查找。
具体的查找过程如下:
递归查询:一般客户机和服务器之间属递归查询,即当客户机向DNS服务器发出请求后,若DNS服务器本身不能解析,则会向另外的DNS服务器发出查询请求,得到结果后转交给客户机。
迭代查询:一般服务器与服务器之间属于迭代查询,按照提示的指引依次查询,直到服务器给出的提示中包含所需要查询的主机地址为止,一般每次指引都会更靠近根服务器(向上),查寻到根域名服务器后,则会再次根据提示向下查找。
关于域名:
2. TCP连接(TCP三次握手,四次挥手)
背景描述:
TCP,提供面向连接的服务,在传送数据之前必须先建立连接,数据传送完成后要释放连接。因此TCP是一种可靠的的运输服务,但是正因为这样,不可避免的增加了许多的开销,比如确认,流量控制等。对应的应用层的协议主要有 SMTP,TELNET,HTTP,FTP 等。
UDP,在传送数据前不需要先建立连接,远地的主机在收到UDP报文后也不需要给出任何确认。虽然UDP不提供可靠交付,但是正是因为这样,省去和很多的开销,使得它的速度比较快,比如一些对实时性要求较高的服务,就常常使用的是UDP。对应的应用层的协议主要有 DNS,TFTP,DHCP,SNMP,NFS 等。
- TCP中常用的端口号
应用程序 | FTP | SMTP | TELNET | HTTP | SSH | MYSQL | TFTP | DNS |
---|---|---|---|---|---|---|---|---|
端口 | 21,20 | 23 | 25 | 80 | 22 | 3306 | 69 | 53 |
传输层协议 | TCP | TCP | TCP | TCP | TCP | TCP | UDP | UDP |
- TCP与socket概述
TCP把连接作为最基本的对象,每一条TCP连接都有两个端点,这种断点我们叫作套接字(socket),它的定义为端口号拼接到IP地址即构成了套接字,例如,若IP地址为192.3.4.16 而端口号为80,那么得到的套接字为192.3.4.16:80。
-
TCP报文
(1)源端口和目的端口,各占2个字节,分别写入源端口和目的端口;
(2)序号,占4个字节,TCP连接中传送的字节流中的每个字节 都按顺序编号。例如,一段报文的序号字段值是 301 ,而携带的数据共有100字段,显然下一个报文段(如果还有的话)的数据序号应该从401开始;
(3)确认号,占4个字节,是期望收到对方下一个报文的第一个数据字节的序号。例如,B收到了A发送过来的报文,其序列号字段是501,而数据长度是200字节,这表明B正确的收到了A发送的到序号700为止的数据。因此,B期望收到A的下一个数据序号是701,于是B在发送给A的确认报文段中把确认号置为701&