python(网络编程-TCP vs UDP)

                                                   TCP vs UDP

 

一、浏览器输入一个url中间经历了什么

    1、中间涉及到了哪些过程?

        

        (1) DNS 查询

            网络通讯大部分是基于 TCP/IP 的,而 TCP/IP 是基于 IP 地址的,所以计算机在网络上进行通讯时只能识别如 "202.96.134.133" 之类的 IP 地址,而不能识别域名。我们无法记住太多网站的 IP 地址,所以我们访问网站时,更多的是在浏览器地址栏中输入域名,就能看到所需要的页面,这是因为有一个叫 "DNS服务器" 的计算机自动把我们的域名解析成了相应的 IP 地址,然后调出 IP 地址所对应的网页。

            DNS(Domain Name System) 是 "域名系统" 的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于 TCP/IP 网络,它所提供的服务是用来将主机名和域名转换为 IP 地址的工作。DNS 就是这样一位 "翻译官",它的基本工作原理可用斜土来表示。

                

            DNS 的获取流程:

                DNS 是应用层协议,事实上它是为其他应用层协议工作的,包括但不限于 HTTP 和 SMTP 以及 FTP,用于将用户提供的主机名(域名)解析为 IP 地址。

                a、用户主机上运行着 DNS 的客户端,就是我们的 PC 机或者手机客户端运行着 DNS 客户端了;

                b、浏览器将接收到的 url 抽取出域名字段,就是访问的主机名,比如:http://www.baidu.com,并将这个主机名传送给 DNS 应用的客户端;

                c、DNS 客户机端向 DNS 服务器端发送一份查询报文,报文中包含着要访问的主机名字段(中间包括一些列缓存查询以及分布式 DNS 集群的工作);

                d、该 DNS 客户机最终会收到一份回答报文,其中包含有该主机名对应的 IP 地址;

                e、一旦该浏览器收到来自 DNS 的 IP 地址,就可以向该 IP 地址定位的 HTTP 服务器发起TCP连接。

            DNS 服务的体系架构:根 DNS 服务器、顶级 DNS 服务器、权威 DNS 服务器

                

            DNS 的查询过程:

                

                a、在浏览器中输入 www.qq.com 域名,操作系统会先检查自己本地的 hosts 文件是否有这个网址映射关系,如果有,就先调用这个 IP 地址映射,完成域名解析;

                b、如果 hosts 里没有这个域名的映射,则查找本地 DNS 解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析;

                c、如果 hosts 与 本地 DNS 解析器缓存都没有相应的网址映射关系,首先会找 TCP/IP 参数中设置的首选 DNS 服务器,在此我们叫它本地 DNS 服务器,此服务器收到查询时,如果要查询的域名包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性;

                d、如果要查询的域名不由本地 DNS 服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个 IP 地址映射,完成域名解析,此解析不具有权威性;

                e、如果本地 DNS 服务器本地区域文件与缓存解析都失效,则根据本地 DNS 服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地 DNS 就把请求发至 13 台根 DNS,根 DNS 服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个 IP。本地 DNS 服务器收到 IP 信息后,将会联系负责 .com 域的这台服务器。这台负责 .com 域的服务器收到请求后,如果自己无法解析,它就会找一个管理 .com 域的下一级 DNS 服务器地址(qq.com)给本地 DNS 服务器。当本地 DNS 服务器收到这个地址后,就会找 qq.com 域服务器,重复上面的动作,进行查询,直至找到 www.qq.com 主机;

                f、如果用的是转发模式,此 DNS 服务器就会把请求发至上一级 DNS 服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根 DNS 或把请求转至上上级,以此循环。不管本地 DNS 服务器使用转发还是根提示的方式,最后都是把结果返回给本地 DNS 服务器,由此 DNS 服务器返回给客户机。

        (2) TCP 握手

            TCP 三次握手,状态转换。用 wireshark 抓包更直观。

            序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。

            确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号;序列号表示报文段携带数据的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;因此当前报文段最后一个字节的编号+1即为确认号。

            确认ACK:占1位,仅当ACK=1时,确认号字段才有效。ACK=0时,确认号无效。

            同步SYN:连接建立时用于同步序号。当SYN=1,ACK=0时表示:这是一个连接请求报文段。若同意连接,则在响应报文段中使得SYN=1,ACK=1。因此,SYN=1表示这是一个连接请求,或连接接受报文。SYN这个标志位只有在TCP建产连接时才会被置1,握手完成后SYN标志位被置0。

            终止FIN:用来释放一个连接。FIN=1表示:此报文段的发送方的数据已经发送完毕,并要求释放运输连接。

            PS:ACK、SYN和FIN这些大写的单词表示标志位,其值要么是1,要么是0;ack、seq小写的单词表示序号。

            

            

            第一次握手:建立连接时,Client 将标志位 SYN 设置为1,随机产生一个值 seq=x,并将数据包发送给 Server,Client 进入 SYN_SENT 状态,等待 Server 确认。SYN:同步序列编号(Synchronize Sequence Numbers)。

            第二次握手:Server 收到数据包后由标志位 SYN = 1 知道 Client 请求建立连接,Server 将标志位 SYN 和 ACK 都置为 1,ack = x + 1,随机产生一个值 seq = y,并将该数据包发送给 Client 以确认连接请求,Server 进入 SYN_RCVD 状态。

            第三次握手:Client 收到确认后,检查 ack 是否为 x + 1,ACK 是否为 1,如果正确则将标志位 ACK 置为 1,ack = y + 1,并将数据包发给 Server,Server 检查 ack 是否为 y + 1,ack 是否为 1,如果正确则连接建立成功,Client 和 Server 进入 ESTABLISHED 状态,完成三次握手,随后 Client 与 Server 之间可以开始传输数据了。

        (3) HTTP 请求

            HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等),具有如下特点:无连接、媒体独立、无状态。

                a、无连接:

                    无连接的含义是限制每次连接只能处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

                b、媒体独立:

                    只要客户端和服务器知道如何处理数据内容,任何类型的数据都可以通过 HTTP 发送。客户端以及服务器指定使用适合的 MIME-type内容类型。

                c、无状态:

                    HTTP 协议是无状态协议。无状态是指协议对于事物处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

            HTTP 协议通信流程:

                

            一个 HTTP 请求报文由 请求行(request line)、请求头部(headers)、空行(blank line)、请求数据(request body) 4部分组成。

            

                a、请求行分为三部分:请求方法、请求地址URL、HTTP 协议版本,它们之间用空格分隔。例如,GET /index.html HTTP/1.1。

                    HTTP1.0 定义了三种请求方法:GET,POST,HEAD 方法。

                    HTTP 1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE、CONNECT 方法。

                    

                b、HTTP 响应头信息:

                    

                    

                c、HTTP 状态码:

                    

        (4) 反向代理 Nginx

            

            Nginx 在做反向代理时,提供性能稳定,并且能够提供配置灵活的转发功能。Nginx 可以根据不同的正则匹配,采取不同的转发策略,比如图片文件结尾的走文件服务器,动态页面走web服务器,只要正则写的没问题,又有相对应的服务器解决方案,就可以随心所欲的玩。并且 Nginx 对返回结果进行错误页跳转,异常判断等。如果被分发的服务器存在异常,Nginx 也可以将请求重新转发给另外一台服务器,然后自动去除异常服务器。

        (5) uwsgi / gunicom

            a、uwsgi:

                uWSGI 是一个 Web 服务器,它实现了 WSGI 协议、uwsgi 协议、http 等协议。Nginx 中 HttpUwsgiModule 的作用是与 uWSGI 服务器进行交换。

                要注意 WSGI / uwsgi / uWSGI 这三个概念的区分:

                    WSGI:一种通信协议。

                    uwsgi:一种线路协议而不是通信协议,在此常用于在 uWSGI 服务器与其他网络服务器的数据通信。

                    uWSGI:实现了 uwsgi 和 WSGI 两种协议的 Web 服务器。

                uwsgi 协议是一个 uWSGI 服务器自有的协议,它用于定义传输信息的类型(type of information),每一个 uwsgi packet 前 4byte 为传输信息类型描述,它与 WSGI 相比是两样东西。

            b、gunicom:

        (6) web app 响应

            django、flask、tornado

        (7) TCP 挥手

            

            第一次挥手:Client 发送一个 FIN,用来关闭 Client 到 Server 的数据传送,Client 进入 FIN_WAIT_1(终止 等待1) 状态。

                TCP规定,FIN 报文段即时不写带数据,也要小号一个序号。

            第二次挥手:Server收到 FIN 后,发送一个 ACK 给 Client,确认序号为收到序号 + 1(与 SYN 相同,一个 FIN 占用一个序号),Server 进入 CLOSE_WAIT 状态。Client 收到 Server 的确认请求后,此时,Client 进入 FIN_WAIT_2(终止等待2) 状态,等待 Server 发送连接释放报文(在这之前还需要接受服务器发送的最后的数据  )。

            第三次挥手:Server 发送一个 FIN,用来关闭 Server 到 Client 的数据传送,Server 进入 LAST_ACK 状态。

            第四次挥手:Client 收到 FIN 后,发送一个 ACK 给 Server,确认序号为收到序号 + 1,Client 进入 TIME_WAIT(时间等待) 状态。注意此时 TCP 连接还没有释放,必须经过 2 ** MSL(最长报文段寿命) 的时间后,当 Client 撤销 TCB 后,才进入 CLOSED 状态。 Server 收到来自 Client发出的确认,进入 CLOSED 状态,完成四次握手。

        (8) wireshark 抓包

    2、包含哪些网络协议?

    3、每个协议都干了什么?

二、TCP / UDP 的区别

    1、对比

        

    2、总结

        (1) TCP 向上层提供面向连接的可靠性服务,UDP 向上层提供无连接不可靠服务。

        (2) 虽然 UDP 并没有 TCP 传输来的准确,但是也能在很多实时性要求高的地方有所作为。

        (3) 对数据准确性要求高,速度可以相对较慢的,可以选用 TCP。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值