zoukankan      html  css  js  c++  java
  • 学习几个协议

    TCP VS UDP

    相同点:

    首部都包含了16位的源端口号、目的端口号和校验和。都是基于IP协议的传输层协议。

                  图一 TCP首部

                  图二 UDP首部

    差异点:

    1、  连接:TCP是面向连接的,需要通过三次握手建立连接,数据交互还有ACK机制,UDP没有连接的概念;

    2、  可靠:TCP是可靠的,UDP是不可靠的;

    3、  数据包顺序:TCP会对数据包进行重排序,而UDP本身不会重排序,只能依赖应用对数据重排序;

    4、  传输速度:TCP要慢于UDP,因为UDP只管发送,一旦发出去就不管了;

    5、  头部大小:TCP大小20字节,UDP大小8字节;

    6、  数据流:TCP是字节流,UDP是数据报;

    7、  数据流控:TCP通过滑动窗口和拥塞控制来进行流控,UDP没有流控;

    8、  错误检查:TCP会进行错误检查和错误恢复,通过快速重传和快速恢复来实现,而UDP是不会进行错误检查的,所以也没有错误恢复的概念;

    9、  头部数据结构:从图一、图二知道TCP的数据结构比UDP复杂; 

    基于TCP/UDP的协议

    TCP

    UDP

    HTTP, HTTPs, FTP, SMTP, Telnet等

    DNS, DHCP, TFTP, SNMP, RIP, VOIP等

    咱们借着生活中的上网这个场景来学习下几个协议。

    1、DHCP

    随着网络的发展,现在大家上网几乎都是通过无线网卡对接路由器,路由器再对接运营商,很少自己再配置IP、子网掩码、网关等,因为这些对于大部分普通网民来说,都略显专业,但是如果要上网,是不可能绕过IP地址等去实现的,这个时候就是DHCP协议发挥作用的时候。

                                     图三 DHCP抓包

                            图四 序号1

                            图五 序号2

    从如上截图可以看出DHCP是基于UDP的,图四对应图三的序号1,图五对应的是图三的序号2。

    序号1的Ethernet源地址就是本机MAC,目的地址这个时候不知道,就设置为ff: ff: ff: ff: ff: ff,通过广播的方式发送出去,对应的网络层,可以看到源地址和目的地址这个时候都不知道,所以分别设置为了0.0.0.0和255. 255. 255. 255,对应的应用层,按DHCP协议设置好的,发送方为68端口,接收方为67端口。数据报基本就是按照上述构造完成,然后广播发送出去,因为Ethernet设置为了ff: ff: ff: ff: ff: ff,所以每个接收方收到后都必须进行分析,当看到发送方IP是0.0.0.0,接收方为255. 255. 255. 255,DHCP服务器知道这个是给自己的,其他接收方则丢弃。

    序号2就是DHCP服务器给出响应,可以看出Ethernet发送方为TP-Link(我的无线路由器)和接收方(我的电脑 看图六MAC地址),IP地址则分别为路由器IP和本机电脑IP,端口刚好和序号1相反。

    经过DHCP协议,我的电脑获取到可上网的IP和其他各项配置。

            图六

    2、ARP

    分配好了IP之后,我的电脑就可以上网了,意味着可以传输IP数据了。传输IP数据又存在两种情况,一种是发送方和接收方位于同一子网,直接通过IP协议就可以将数据给到接收方,另一种则是发送方和接收方不在同一子网,此时便需要通过IP路由寻找到位于同一子网的路由器进行IP数据转发。这里对于鉴定同一子网和IP路由方式暂且不表,后续有机会再深入学习,对于上述两种方式,我们知道,不管怎么发送都需要先找到主机(接收方)或者路由器。我们只有IP地址,没有物理地址,这个时候ARP协议派上用场,将IP地址转换为物理硬件地址。

                                   图七

                            图八 序号10

                            图九 序号11

    从图八可以看出发送方是我的电脑(看图六),接收方是ff: ff: ff: ff: ff: ff,这是个广播地址,实际ARP本来也就是用作广播,将数据报发送给Ethernet每个接口,每个接口都需要对这个数据进行处理,从中取出IP地址,与自身的IP地址进行比较。如果两者相同,都做出回复,向对方报告自己的MAC地址,否则就丢弃这个包。

    3、HTTP

    HTTP(HyperText Transport Protocol)是超文本传输协议的缩写,它用于传送WWW方式的数据,HTTP基于TCP协议,是目前互联网快速发展的基础。以访问http://www.cnblogs.com/iou123lg/p/9017044.html为例来了解下这个协议。

                                          图十

    图十是我用Wireshark抓取的该URL请求,由于整个过程很长,对应的抓取图也比较长,所以我是多个图拼接成的图十。从图中一头一尾可以看出TCP的三次握手和四次挥手。中间体现的就是,在一次TCP连接中,依次发送了5次GET请求,可以看出每请求一次就要等待服务器响应一次。从图中也可以看出几个问题:

    3.1 发送方的发送是阻塞的,一起请求需等待一次响应,如果前一次响应失败,必然影响后续的操作;

    3.2 每次请求至少耗费一次RTT,这种非并发的请求,一旦量多就耗费的资源就很大了;

    3.3 建立一次TCP连接,是很耗费资源,这种HTTP请求处理方式未充分的利用TCP连接资源。

    这其实就是HTTP1.X和HTTP2.0一个重要的区别,HTTP1.X不支持多路复用,而新发展的HTTP2.0通过多路复用来解决上述问题,具体HTTP1.X和HTTP2.0的区别可以看参考链接。

    4、DNS

                              图十一

                             图十二 序号852

                             图十三 序号867

    在学习HTTP的过程中,有个点没有讨论,就是根据http://www.cnblogs.com/是怎样转换成去请求IP的,这个就是DNS的作用。DNS服务器的配置是在DHCP阶段已经分配好了,请求域名的时候,就是本机IP向DNS服务器请求域名转换过程,见图十一。

    从图十二中可以看到DNS服务器为10.64.0.100,本机IP向10.64.0.100请求cnblogs.com的IP,图十三给出了响应地址116.62.82.XX。细心的人可以发现这个IP和图十HTTP请求的IP不一样,这是因为对外暴露的IP是和域名有一一对应的关系,而实际应用处理请求时会从主机IP通过负载均衡给到实际应用服务器的IP。

            

    以上是我对几个协议的学习认知,如有不当描述,欢迎留言反馈。

    参考资料:

             http://www.ruanyifeng.com/blog/2012/05/internet_protocol_suite_part_i.html

             http://www.ruanyifeng.com/blog/2012/06/internet_protocol_suite_part_ii.html

             https://www.zhihu.com/question/34074946

             https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol

  • 相关阅读:
    python安装依赖包方法
    python 连接mysql数据库
    python学习5 爬虫老是被封如何解决
    python4
    python mysql增删改查
    jieba.analyse jieba.textrank 简单用法
    记录一些小问题
    《面向模式的软件体系架构》读书笔记(三)
    《面向模式的软件体系架构》读书笔记(二)
    安全性战术
  • 原文地址:https://www.cnblogs.com/iou123lg/p/9064690.html
Copyright © 2011-2022 走看看