分类 计算机网络 下的文章

一、UDP协议

UDP协议是一种简单的面向数据报的传输层协议,它不提供差错纠正、队列管理、重复消除、流量控制以及拥塞控制等功能。它只提供最小的差错检测功能,要想保证数据被可靠的投递或正确排序,应用程序必须自己实现这些功能。

因为它是无连接协议,所以它比其他传输层协议使用更少的开销。

UDP的首部如下:

UDP首部共包含8个字节,内容很简单,仅仅包含了源目端口号、报文长度以及校验和这四个元素。其中,长度字段表示的是数据长度和首部长度

二、UDP校验和

UDP校验和要用到一个伪首部,用到来自IP数据报中的部分字段,伪首部的结构如下:

伪头部的目的是让UDP层验证数据是否已经到达正确目的地(即,该IP没有接受地址错误的数据报,也没有给UDP一个其他传输协议的数据报),它不会被发送出去,只用作校验功能。

注意

  1. UDP数据报长度可以是奇数个字节,而校验算法只相加16位(2字节),因此如果UDP长度是奇数时,计算校验和会在末尾补零(但不会被发送出去)。
  2. UDP中的校验和是可选的(强烈建议使用)。因此对于使用UDP的应用层协议,在收到数据时应当先校验校验和。

三、UDP/IP分片

UDP数据报文最大可达2^16=65535个字节,除去首部还剩下65527个字节。但是受限于网络中的MTU等设置,过长的UDP数据报文段将会在IP数据报中分片。例如在一个MTU为1500的网络环境中发送一个长度为3000的UDP报文将会以如下形式发送出去:

注意:

  1. 偏移的单位是8个字节,例如第二片的偏移是185,实际上是第185*8=1480个字节。

ARQ全称是Automatic repeat request,是TCP中实现可靠传输的重传协议,它的核心思想是停止等待协议。

一、停止等待协议

停止等待协议是数据链路层中最基础的协议,在数据发送出去后,如果没有收到对端的回复,会一直等待对方回复。直到触发超时机制再自动重传,确保数据传输的可靠性。

一个没差错的停止等待协议交互过程为:

一旦出现了差错,停止等待协议会重发数据包,直到数据发送成功:

TCP协议的核心思想就是这样,如果发现数据出现了丢失,就要重传这个数据包,直到数据发送成功为止。

那么如何确定数据报丢失了?TCP使用一个重传计时器对发送报文段计时,如果在计时器归零时还没有收到对端回复,那么就认为数据报已经丢失,需要重传。重传计时器的计时时间被称为RTO,他是通过数据报往返时间动态测量出来的,不同系统上实现也不同。参考:TCP中的RTT和RTO

二、连续ARQ协议

连续ARQ协议指的是每次发送数据时,不是发送一个数据报文,而是同时发送多个报文。因为如果每次都只发送一个数据报,信道的利用率极低,传输效率不高。

连续ARQ协议的作用就是为了弥补这个不足,在发送数据时,不用每次都等到上一个数据包确认后才发送下一个,而是每次都发送一组数据包。确认数据包的同时还继续发送数据包,这样就大大提高了效率。

不出现差错的情况下的交互过程:

出现差错的交互过程:

三、滑动窗口协议

连续ARQ协议是配合滑动窗口协议来完成,每次分组发送的报文数量取决于窗口大小。

参考:TCP的滑动窗口协议

IPv6地址的用法

一、IPv6表示法

IPv6于上世纪90年代提出,当时提出的目的是为了扩展极度匮乏的IPv4地址。

然而到现在二十多年的发展历程中,虽然一直都在强调要推广它的使用,但至今依旧是不温不火的状态。

IPv6地址有128位,是IPv4长度的4倍,IPv4一般使用点来隔开每一个字节,如192.168.10.1,这种方法俗称点分式表示法。

IPv6则使用冒号来隔开表示,每16个字节一段,形如ffff:0011:2222:0033:4444:0055:6666:ff01

1.1 简化方法

  1. 块中的前导0可以省略不写,例如上面的地址可以写成ffff:11:2222:33:4444:55:6666
  2. 全零的块可以省略,用符号::代替。例如ffff:0000:0000:0000:0000:0000:0000:1111可以写成ffff::1111
  3. IPv6可以嵌入IPv4地址,紧接着IPv4地址的块的值为ffff,其余使用点分式写法。例如::ffff:192.168.10.1可表示192.168.10.1

为了在URL中区别端口号,在URL中使用IPv6地址可要用中括号[]括起来:

http://[2001::ff01]:8080/index.html

二、IPv6使用

2.1 windows设置IPv6

image

2.2 linux设置IPv6

linux配置ipv6:

ifconfig eth0 inet6 add abcd::ff03/120

2.3 PING6

linux平台可以使用ping6命令来ping IPv6地址:

TCP与UDP基本区别:

  • TCP提供的是面向连接,类似于打电话,会有握手流程。UDP无连接,类似广播。
  • TCP要求系统资源较多,UDP程序结构较简单,要求的系统资源也较少。
  • TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达。UDP尽最大努力交付,即不保证可靠交付。
  • 流模式(TCP)与数据报模式(UDP),TCP面向字节流,UDP面向报文。
  • TCP保证数据正确性,UDP可能丢包。
  • TCP保证数据顺序,UDP不保证。
  • TCP连接只能是点到点的;UDP支持一对一、一对多、多对一和多对多的交互通信。

为什么UDP有时比TCP更有优势:

UDP以其简单、传输快的优势,在越来越多场景下取代了TCP,如实时游戏。

  1. 网速的提升给UDP的稳定性提供可靠网络保障,丢包率很低,如果使用应用层重传,能够确保传输的可靠性。
  2. TCP为了实现网络通信的可靠性,使用了复杂的拥塞控制算法,建立了繁琐的握手过程,由于TCP内置的系统协议栈中,极难对其进行改进。采用TCP,一旦发生丢包,TCP会将后续的包缓存起来,等前面的包重传并接收到后再继续发送,延时会越来越大,基于UDP对实时性要求较为严格的情况下,采用自定义重传机制,能够把丢包产生的延迟降到最低,尽量减少网络问题对游戏性造成影响。

一、三次握手

TCP协议的三次握手和四次挥手分别表示了TCP连接的建立和释放过程,在整个TCP协议是一个很重要的内容,同时也是面试时的常见考点。

趁着找工作的劲,使用socket+tcpdump分析了一下工作流程,socket客户端代可以在socket介绍及函数原语找到。服务端的代码可以在socket的select模型找到。

socket中各函数对应的TCP状态演示图:

- 阅读剩余部分 -

一、概述

X-Forwarded-For, X-Real-IP, remote_addr是http协议中用来表示客户端地址的请求头。

X-Forwarded-ForX-Real-IP只有请求存在代理时才有值,而remote_addr一直存在。

  • X-Forwarded-For:记录代理服务器的地址,每经过一个代理,该字段会加上一个记录。格式形如:1.1.1.1, 2.2.2.2
  • X-Real-IP:也是用来记录服务器的地址,但是和上面的不同,它不把记录添加到结尾,而是直接替换
  • remote_addr:上一个客户端连接的地址,不存在代理就表示客户端的地址,存在代理就表示最后一个代理服务器的地址

- 阅读剩余部分 -

使用CDN的时候遇到了跨域的问题,在网上找解决方法都是说在nginx里面加上请求头,然而设置了请求头后发现还是没有解决问题。所以为了解决问题,并且彻底弄清楚这其中的原理,花了半天时间仔细分析了一下。

一、什么是跨域

1.1 跨域描述

跨域是一种安全机制,使浏览器只能在页面内执行同源站点的脚本文件,避免出现跨站脚本调用。

- 阅读剩余部分 -

HTTP协议(一):概述

一、概述

超文本传输协议(Hypertext Transfer Protocol, HTTP)是当今网络的重要角色之一,也是万维网(World Wide Web, WWW)的核心组成。它的特点为:

  • 无连接:HTTP是一个无连接的协议,虽然基于TCP,但是每次进行数据交互之前,无需先建立HTTP连接。
  • 无状态:HTTP协议不保存任何连接的状态和连接时的数据信息,每一个新的连接都是完全陌生的。

它是一个基于TCP的协议,因此,每次连接的建立和关闭都要进行三次握手四次挥手操作。

- 阅读剩余部分 -

计算机网络体系结构有三种:OSI分层(7层)、五层协议(5层)和TCP/IP分层(4层)。

三者之间的分层示意图:

每一层的作用如下:

  • 物理层:通过媒介传输比特,确定机械及电气规范(比特Bit)
  • 数据链路层:将比特组装成帧和点到点的传递(帧Frame)
  • 网络层:负责数据包从源到宿的传递和网际互连(包PackeT)
  • 传输层:提供端到端的可靠报文传递和错误恢复(段Segment)
  • 会话层:建立、管理和终止会话(会话协议数据单元SPDU)
  • 表示层:对数据进行翻译、加密和压缩(表示协议数据单元PPDU)
  • 应用层:允许访问OSI环境的手段(应用协议数据单元APDU)

各层包含的协议:

  • 物理层:RJ45、CLOCK、IEEE802.3
  • 数据链路:PPP、FR、HDLC、VLAN、MAC
  • 网络层:IP、ICMP、ARP、RARP、OSPF、IPX、RIP、IGRP
  • 传输层:TCP、UDP、SPX
  • 会话层:NFS、SQL、NETBIOS、RPC
  • 表示层:JPEG、MPEG、ASII
  • 应用层:FTP、DNS、Telnet、SMTP、HTTP、WWW、NFS
在计算机网络中,我们通常使用的是5层表示法。因此数据链路层也被称为二层,网络层被称为三层。