美文网首页程序员
计算机网络学习笔记

计算机网络学习笔记

作者: 无知者云 | 来源:发表于2018-12-20 11:03 被阅读9次
    • 子网划分只是一种逻辑上的划分方式,子网与广播域之间并不存在一一对应的关系。
    • 一个VLAN上也可以运行多个子网,只是通常情况下我们在实施时将子网与VLAN一一对应了。
    • 路由器隔离广播帧,路由器将丢弃广播帧。
    • 以太网中一台机器发送的数据所有机器都能接收到,然后基于目的地MAC判断是否接收该数据。
    • 当以太网中计算机发现有CRC检查出错时,直接丢弃该包。数据的可靠性传输交给了TCP这样的高层协议。以太网保证最大努力交付,即不可靠交付。
    • 以太网通过CSMA/CD保证同一时刻只有一台计算机在发送数据,并且是半双工,如果发现有碰撞,则推迟一个随机时间再次发送。
    • 以太网采用曼彻斯特编码。
    • 10BASE-T双绞线以太网的出现,是局域网发展史的重要里程碑,从此以太网拓扑有总线型变为星型,而以太网在局域网中占据了统治地位。
    • 使用了集线器的以太网在逻辑上依然是个总线网,依然采用CSMA/CD协议。
    • MAC地址一共6个字节,前三个字节由IEEE统一分配,由商家购买,后三个字节有商家自行分配。
    • 网卡在收到数据帧时通过硬件判断该帧的目的MAC地址是否发往本站,如果不是则丢弃。以下三种情况下表示帧是发往本站的:
      • 单播,即帧目的MAC地址=本机MAC地址
      • 多播,发送给该局域网上一部分机器
      • 广播,发送给局域网上所有的机器,MAC地址全是F
    • 网卡可以设置为混杂模式,即不是发往本机的帧也可以接下来,比如有些抓包软件便是以这种方式工作的。
    • 以太网各帧之间的发送有一定间隙,因此帧不需要结束定界符。
    • 同一个冲突域下的所有主机,同一时刻都只允许一台机器发送数据。
    • 网桥有两个端口,通过对比目的地MAC与网桥内部的地址表来判断帧是否送往另一个端口。
    • 二层交换机其实就是一个多接口的网桥,每个接口连接一台计算机或者另一个交换机,每一个接口对应一个冲突域,数据可以全双工传输。
    • 二层交换机在没有查到地址表记录时,则向所有端口广播(泛洪)该帧,请注意这里的广播并不是是广播帧的一是,而只是一种动作。
    • 家用路由器的所有LAN网口相当于其内部通过一个交换机相连接,交换机在连接到路由器的LAN端网卡上。
    • 以太网一开始是总线型的,是因为那时的以太网交换机太昂贵了,而无源的总线结构要廉价得多。
    • 虽然以太网交换机不适用CSMA/CD,但是其数据帧依然使用以太网帧,因此依然叫以太网。
    • 如果交换机某端口接收到了广播帧,则不会查MAC地址表,而是直接将该帧发给所有的其他端口。
    • VLAN通过帧的tag为标记帧是属于哪个VLAN的,广播帧不会在VLAN之间传播,泛洪也只会传播到自己所属的VLAN中。
    • 网络层不提供服务质量的承诺,只保证最大努力传输,不会对数据包进行编号,这样网络层设计比较简单。
    • 网络层中与IP协议配套的还有:ARP协议,ICMP协议,IGMP协议,其中IP使用ARP,而ICMP和IGMP使用IP。
    • 各种异构的网络在网络层看来好像是一个统一的网络,这种网络也称为IP网,主机之间通信无需看到异构的细节,因此有了IP网之后,网络的物理异构性对通信来讲是透明的。在这种覆盖全球的IP网上再使用TCP协议,那么就成了现在的互联网。
    • 分类IP是很原始的IP划分方式,其实在1993年提出的无分类编址之后,虽然在教科书中依然可以看到分类IP,但是事实上基本不用了。
    • 一个网络表示所有IP网络号相同的主机的集合。
    • 实际上IP地址是标识一台主机(或路由器)和一条链路的接口。当一台主机同时连接两个网络是,那么这台主机就必须同时拥有两个IP,比如路由器就是典型的例子。
    • 路由器每一个接口都有不同的网络号,因此一个路由器的接口就连接的一个网络。家用路由器虽然有多个接口,但是所有的LAN口其实背后是一个交换机,该交换机再连接路由器的LAN网卡接口。
    • ARP协议只解决在同一个局域网中主机和路由器的IP地址和MAC地址之间的映射问题。
    • IP协议规定,在互联网中所有主机和路由器,必须能够接收长度不超过576字节的IP数据报,除非知道对方能够接受更大的数据量(比如通过TCP约定),即上层交来的512字节+最大60字节IP首部+4字节富余量。
    • 主机为全部为0的IP地址表示本网络。
    • Linux在重组IP包时,现将所有的分片放到重组队列中,如果30秒中重组队列中的包没有到齐,则重组过程失败(意味着上层,比如TCP,将无法收到该IP包),重组队列被释放,同时向发送方以ICMP协议通知失败信息,参考这里
    • IP包理论上可以有64K字节这么大,但是以太网数据链路的MTU为1500字节,因此对于大于1500字节的IP包都需要进行分片发送。
    • 一个数据包在传输过程中,目的IP和源IP是永远不变的(使用了NAT协议除外),一直是主机和服务器的IP,而目的mac和源mac却是一直变化的,这也是arp协议存在的一个理由,参考这里
    • 三层(IP)广播即IP地址中的主机号全是1的IP包,IP广播将导致二层链路层广播(MAC目的地址全是F)。另外,IP地址为255.255.255.255的也是广播,这种情况用于主机还不知道自己IP地址的时候(比如向DHCP服务器索要地址时、PPPOE拨号时等),由于路由器不会转发广播帧,因此这种广播也不会逃出本地网络,参考这里
    • MTU = MSS + TCP首部长度 + IP首部长度,故在以太网中(网络层以IPv4为例):MSS = 以太网MTU - TCP首部长度 - IPv4首部长度 = 1500 - 20 - 20 = 1460字节。未指定MSS时默认值为536字节,这是因为在Internet中标准的MTU值为576字节,576字节MTU = TCP首部长度20字节 + IPv4首部长度20字节 + 536字节MSS,参考这里
    • 对于IP,如果某个分片被弄丢了, 那么在最终目的地是没办法正确重组的。 整个IP包就是一个垃圾IP包, IP层也不会有重传机制。 如果上次是TCP, 那么TCP会负责重传。可以看到, 分片会带来一些问题, 所以TCP尽量避免分片, 而采用提前分段的方式。
    • MSS是TCP里的一个概念(首部的选项字段中)。MSS是TCP数据包每次能够传输的最大数据分段,TCP报文段的长度大于MSS时,要进行分段传输。TCP协议在建立连接的时候通常要协商双方的MSS值,每一方都有用于通告它期望接收的MSS选项(MSS选项只出现在SYN报文段中,即TCP三次握手的前两次)。MSS的值一般为MTU值减去两个首部大小(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以如果用链路层以太网,MSS的值往往为1460。而Internet上标准的MTU(最小的MTU,链路层网络为x2.5时)为576,那么如果不设置,则MSS的默认值就为536个字节。很多时候,MSS的值最好取512的倍数。TCP报文段的分段与重组是在运输层完成的。到了这里有一个问题自然就明了了,TCP分段的原因是MSS,IP分片的原因是MTU,由于一直有MSS<=MTU,很明显,分段后的每一段TCP报文段再加上IP首部后的长度不可能超过MTU,因此也就不需要在网络层进行IP分片了。因此TCP报文段很少会发生IP分片的情况。
    • IP包中有个"总长度"的字段,为16位,表示整个IP数据包的总长度(字节),从这个16为可以算出理论上IP包的长度最大为2^16=64k字节,但是现实中极少有这种包出现。
    • IP包中的“片偏移”以8个字节为偏移单位,也就是说IP包中的数据量必须为8个字节的整数倍。
    • IP包中的“协议”字段表示该IP包中所包含数据所使用的上层协议,比如TCP、UDP等。
    • 通常来说,路由器中也有默认路由记录,当路由表中找不到目的IP的路由记录时,则使用默认路由。
    • 子网划分之后,所有子网对外依然是一个逻辑上的单一网络,也即外界通过一次路由便可以找到。
    • TCP在通信双方之间建立起了一条基于字节流的全双工通道。
    • TCP包中的序号字段表示该包中第一个字节的序号,序号位有4个字节,也即4G大小。
    • TCP的确认号表示希望对象下一次报文段的第一个字节的序号。
    • TCP连接建立之后,所有的报文的ACK值都必须为1。
    • TCP的PSH(push)值为1时,表示发送方需要立即发送该报文而不缓存,接收方需要立即将将该该报文交付给应用程序。
    • TCP的SYN=1并ACK=0,表示发起连接请求,SYN=1并ACK=1表示接受连接请求,因此SYNC=1的包表示连接的请求或接收报文。
    • TCP的窗口字段为2字节,窗口值告诉对方:从该报文确认号算起,接收方允许对方发送的字节数。之所以有这个窗口值,是因为接收方的缓存是有限的,因此需要进行流量控制。
    • TCP的滑动窗口以字节为单位。
    • Nagle算法用于减少TCP中小包的发送。
    • TCP的窗口值告诉对方:发送方的发送窗口不能超过接收方的接收窗口,TCP的窗口单位是字节,不是报文段。当接收方回复的窗口值为0时,发送方应立即停止发送,直到接收方重新发出一个新的窗口值为止。
    • 应用程序将数据发送到TCP发送缓存后,TCP是如何分段的事情就交给TCP了。
    • Nagle算法:如果应用程序逐个字节的将数据发送到TCP缓存(比如Telnet),那么TCP就先把第一个字节发出去,把后面到达的自己都缓存起来,当收到第一个字节的确认后,再将缓存中的所有数据组装成一个报文发送出去。这样做可以减少TCP所用的网络带宽。
    • Nagle原本就是为诸如Telnet或rlogin这样的应用程序而创建的。
    • Nagle算法还规定:当缓存的数据已经到达发送窗口的一半或者报文段的MSS时,则立即发送。
    • TCP延迟确认算法:通过延迟一定时间(默认40ms),将多个ACK确认包合并在一起发送,这样减少了ACK确认包在网络中的数量,提高了网络性能。
    • 默认情况下Nagle和延迟ACK都是开启的,此时延迟确认和Nagle同时使用会大大降低网络性能,因为发送方在等待接收方的ACK,但是接收方却延迟了ACK。因此Socket提供提供了TCP_NODELAY选项来禁用Nagle算法,参考这里
    • Socket设置TCP_QUICKACK可以禁用延迟确认。
    • TCP_CORK禁止发送小包,可以认为是Nagle算法的增强,因此TCP_CORK和TCP_NODELAY恰恰相反。
    • Linux的sendfile系调用可以实现将服务器中的本地文件直接拷贝(通过DMA)到Socket缓存,进而发送到网络中,避免了文件数据的多次拷贝,参考这里
    • TCP_NOPUSH会设置CORK算法,表示数据包不会马上传送出去,等到数据包最大时,一次性的传输出去,这样有助于解决网络堵塞。
    • Nginx中,当使用sendfile函数时,TCP_NOPUSH才起作用,因为在sendfile时,Nginx会要求发送某些信息来预先解释数据,这些信息其实就是报头内容,典型情况下报头很小,而且套接字上设置了TCP_NODELAY。有报头的包将被立即传输,在某些情况下(取决于内部的包计数器),因为这个包成功地被对方收到后需要请求对方确认。这样,大量数据的传输就会被推迟而且产生了不必要的网络流量交换。而通过设置TCP_NOPUSH=on,表示将所有HTTP的header一次性发出去,参考这里
    • Nginx的TCP_NODELAY只有在配置长连接时才起作用,因为长连接可能引起小包的阻塞,配置TCP_NODELAY可以避免该阻塞,参考这里
    • Use the tcp_nopush directive together with the sendfile on;directive. This enables NGINX to send HTTP response headers in one packet right after the chunk of data has been obtained by sendfile().
    • 在 nginx 中,tcp_nopush 配置和 tcp_nodelay “互斥”。
    • 默认情况下,nginx已经自动开启了对client连接的keep alive支持(同时client发送的HTTP请求要求keep alive)。
    • 默认nginx访问后端都是用的短连接(HTTP1.0),一个请求来了,Nginx 新开一个端口和后端建立连接,后端执行完毕后主动关闭该链接)。
    • 默认路由:A default route is the route that takes effect when no other route is available for an IP destination address.If a packet is received on a routing device, the device first checks to see if the IP destination address is on one of the device’s local subnets. If the destination address is not local, the device checks its routing table. If the remote destination subnet is not listed in the routing table, the packet is forwarded to the next hop toward the destination using the default route. The default route generally has a next-hop address of another routing device, which performs the same process. The process repeats until a packet is delivered to the destination.
    • 通常来说,web服务器,下载服务器(ftp的发送文件服务器),需要带宽量比较大的服务器,用TCP_CORK。涉及到交互的服务器,比如ftp的接收命令的服务器,必须使用TCP_NODELAY

    相关文章

      网友评论

        本文标题:计算机网络学习笔记

        本文链接:https://www.haomeiwen.com/subject/frzekqtx.html