计网

111111111111

网络层

IP地址

  • A B C类地址开头分比为 0 10 110.
  • D类用于多播,1110。
  • A类可指派网络号为128-2.减2是因为网络号全为0为本网络以及网络号全为1(127)为本地环回测试本主机间进程通信。最大主机数为2的24次方减2,因为全为0的主机号表示本主机,全为1的主机号表示该网络上所有主机。
  • B类网络号为2的14次方减1,因为128.0.0.0是不指派的,最小可以指派的B类网络地址是128.1.0.0.最大主机为2的16次方-2,原因同上。
  • C类网络号为2的21次方-1,因为192.0.0.0不指派,最小可指派为192.0.1.0.主机数为2的8次方-2.
  • arp解析过程
  1. arp进程在局域网上广播发送一个arp请求分组(我的ip是XXX,mac地址为XXX,我想知道ip为YYYY的主机的硬件地址?)
  2. 局域网上所有主机收到该请求分组。
  3. IP为YYYY的主机收下这个请求,并对A发送arp响应分组(注意是单独发送,不是广播),其内容为(我是IP为YYYY的主机,我的mac地址为YYY)。同时该主机会将发送源主机的ip地址和mac地址写入本地arp缓存。
  4. 源主机收到响应后,写入mac和ip地址。

私有IP地址

  • A: 10.0.0.0~10.255.255.255 即10.0.0.0/8
  • B:172.16.0.0~172.31.255.255即172.16.0.0/12
  • C:192.168.0.0~192.168.255.255 即192.168.0.0/16
  • 这些地址是不会被Internet分配的,它们在Internet上也不会被路由,虽然它们不能直接和Internet网连接,但通过技术手段仍旧可以和 Internet通讯(NAT技术)。我们可以根据需要来选择适当的地址类,在内部局域网中将这些地址像公用IP地址一样地使用。在Internet上,有些不需要与 Internet通讯的设备,如打印机、可管理集线器等也可以使用这些地址,以节省IP地址资源。

    IP首部

    首部为固定20字节加上可选部分

  • 版本 :占4位

  • 首部长度 :占四位, 计数单位为4字节。也就是说如果该字段值为15(1111)时候,对应首部长度为15*4=60字节,这也是首部的最大长度。当IP首部不是4字节整数倍时,需要填充至4的整数倍。
  • 总长度 : 占16位,因此IP数据报最大长度为2的16次方-1,即65535字节,但实际不会发送这么大的数据报。由于链路层规定了一个数据帧的数据字段最大长度(即最大传输单元MTU,一般设为1500字节)。若IP数据报总长大于MTU,则需要进行分片处理。在进行分片时,该字段是指分片后的每一片的首部长度+该片数据长度的总和。
  • 标识 :相同标识的数据报是同一数据报的分片。
  • 标志 : 占3位。最低位MF(MF=1标识后面还有分片,为0表示这是分片最后一个)。中间位DF(意思为不能分片,DF=表示不能分片,只有DF=0时才允许分片。)
  • 片偏移:某片在原分组的相对位置,以8个字节为单位。每个分片的长度一定为8字节整数倍。
  • 生存时间TTL,占8位。最大值为255,没经过一次路由器转发就减1.
  • 协议:指定使用的何种协议。(如ICMP=1, IGMP=2, TCP=6,UDP=17)
  • 首部检验和:只检验数据报首部,不检验数据。占16位。检验方法:将首部分为很多16位的序列,然后反码相加,将得到的和取反码再放入该字段。接收方同样将接收到的数据报所有16位反码相加,将得到的和取反码。若首部未发生变化,结果必为0,于是保留数据报。否则丢弃。
  • 源地址 32位
  • 目的地址 32位

路由器转发过程

  1. 从首部提取目的主机IP地址D,得出目的网络地址N。
  2. 若N就是路由器直连某网络,直接交付。
  3. 若路由表有目的地址为D的特定主机路由,则交付给他
  4. 若有到达网络N的路由,交付给他
  5. 若有默认路由,交付给他
  6. 否则报告分组转发错误。

子网

从网络的主机号中借用若干位作为子网号,于是两级IP地址便成为了三级IP地址。

子网掩码

如对一个目的IP为145.13.3.10的数据报已经到达了网络地址为145.13.0.0的路由器,那如何转发到子网145.13.3.0(这里假设子网号占8位)呢?从目的ip是无法看出是否进行了子网划分的。答案就是使用子网掩码。

  • 对于一个网络如145.13.0.0,如果进行了子网划分,则可根据其子网掩码与目的IP进行与运算的处子网地址。对于B类地址,若未进行子网划分,则其默认子网掩码为255.255.0.0.而对于子网号占八位的子网145.13.3.0,其子网掩码为255.255.255.0,用这个子网掩码与IP地址进行与运算,得到结果为145.13.3.0,正好为子网地址。
  • 子网数 = 2的n次方-2 ;其中n为子网号所占位数,-2时取出全为0和全为1的情况。
  • 划分子网增加了灵活性,但是减少了最大连接主机数目。

使用子网时候的分组转发过程

  1. 从收到的数据报首部提取目的ip地址D。
  2. 先判断是否直接交付。对路由器直连的网络追个检查,用各个网络子网掩码与D进行与操作,看是否与相应的网络地址匹配。若匹配则直接交付,否则为间接交付,执行3.
  3. 若路由表有目的地址为D的特定主机路由,则把数据报传送给所指定的下一跳路由器;否则执行4。
  4. 对路由表每一行(目的网络地址, 子网掩码, 下一跳地址),用其中子网掩码与D与操作,如果结果即为改行目的网络地址,则将数据报传给对应的下一跳地址;否则执行5。
  5. 若路由表有一个默认路由,则报数据报传给默认路由;否则报告分组转发错误。

网际控制报文协议(ICMP)

ICMP报文作为ip数据报中数据部分,再加上数据报的首部组成ip数据报发出去的,用于更有效的转发ip数据报和提高成功交付。

  • ICMP前四个字节共有三个字段(类型 代码 检验和)

ICMP差错报告报文

类型对于如下

  • 【3】 终点不可达:当路由器或主机不能交付数据报时,就像原点发送终点不可达。
  • 【11】 超时 : 当路由器收到生存时间为0的数据报时候,会丢掉该数据报并发送超时报文。当终点在规定时间未收到全部的数据报时,就会丢到已收取的数据报并向源点发送超时报文。
  • 【12】 参数问题 :当路由器或目的主机收到的数据报首部字段值不正确时丢弃报文并发送参数问题数据报。
  • 【5】 改变路由 :通知主机发送数据报可以选择更好的路由。</br>
    ICMP报文数据段 = ICMP差错报文的前8字节 + 出错数据报的首部 + 出错数据报的数据段前8个字节</br>
    提取出错数据报数据段前8个字节是为了得到运输层的端口号和发送序号。</br>
    不应发送差错报告报文的情况:
  • 对ICMP差错报告报文不能发送ICMP差错报告报文。
  • 对第一个分片的数据报的后续分片。
  • 对具有多播地址的数据报都不发送。
  • 对具有特殊地址(如127.0.0.0或0.0.0.0)的数据报也不发送。

ICMP询问报文

  • 回送请求和回答报文:向特定主机发出询问测试是否能通信。如PING命令
  • 时间戳请求和回答报文。

ping命令

ping命令时发送ICMP询问报文中的回送请求和回答报文的一个例子,它不经过运输层,是应用层和网络层直接通信。

  • TTL(生存时间),IP数据报没经过一个路由器,其TTL减1,当到达某路由器时若其TTL为0,则路由器会向源点发送超时ICMP报文。

运输层

运输层向他上面的应用层提供通信服务。当两台主机通信时,只有主机的协议栈才有运输层,中间的路由器只用到下三层的功能。

端口号

熟知端口号(0-1023)

  • FTP 21
  • TELNET 23
  • HTTP 80
  • HTTPS 443
  • DNS 53

UDP(用户数据报协议)

特点:

  • 面向无连接
  • 尽最大努力但不保证可靠交付
  • 面向报文。一次交付一个完整的报文。
  • 没有拥塞控制,因此网络拥塞不会导致其主机发送速率变低。适合于实时引用如IP电话,实时视频,王者荣耀等要求低延迟场合。
  • 支持一对一 一对多 多对一 多对多
  • 首部小 8字节

UDP首部

  • 源端口目的端口 各站2字节
  • 长度 : UDP用户数据报的长度,最小值为8(仅有首部)
  • 检验和 : 同时检验首部和数据。

    TCP(传输控制协议)

    特点:
  • 面向连接的协议。
  • 点对点。
  • 提供可靠交付
  • 全双工通信
  • 面向字节流

TCP首部

TCP首部前20字节为固定的,后面有4n字节按需增加。

  • 源端口和目的端口,各站两个字节
  • 序号seq:占4字节。表示本报文发送的第一个字节的序号。
  • 确认号ack: 4字节。若确认号为N,表示到序号N-1的字节已经全部正确接收到了。
  • 数据偏移:4字节。即TCP首部最大长度(以4字节为单位计算),因此TCP首部最大为60字节。
  • URG紧急位
  • ACK确认号:在连接建立后所有报文都必须把ACK置1.
  • RST复位: 当RST=1时说明TCP出现严重错误,必须释放连接重新建立。
  • SYN同步。
  • FIN终止。
  • 窗口:2字节。作为接收方让其设置其发送窗口的依据。
  • 检验和 :检验首部和数据。计算时要加12字节伪首部。</br>
    以上为固定20字节,以下为可选
  • MSS:最大报文段长度。是指TCP报文的数据字段的最大长度。

TCP发送机制

  • 使用Nagle算法:若发送方用户进程把要发送的数据逐个送到发送缓存中,则发送方就先把第一个字节数据发送出去,把后面的数据字节全部缓存起来,当发送放收到对第一个字节的确认报文时,才把发送缓存剩下所有的数据组成一个报文发送出去,同时对随后的数据进行缓存,只有收到前一个报文的确认后才发送下一个报文。另外,Nagle也规定,当到达的数据已经达到发送窗口一半大小或已达到MSS时就立即发送一个报文段。
  • 糊涂窗口综合征:设想TCP接收缓存已满,而应用进程一次只读取一个字节(此时接收缓存腾出一个字节空间),然后向发送方发出确认,并把窗口设为1字节(数据报为40字节)。发送方接到确认后又发送一个1字节(40+1字节)。。。。。这样会降低效率
  • 解决方法:让接收方等待缓存空余空间较多时才发出确认报文(如一半)。

TCP连接建立

设A为客户端 B为服务器,开始时B处于listen状态。

  • A发出连接请求报文段(SYN = 1, 初始序列seq = x),同步报文(SYN = 1)是不能携带数据的,且要消耗一个序号。此时客户进入SYN=SENT同步已发送状态。
  • B收到连接请求报文后,若同意连接,则发送确认报文段(SYN = 1, 确认位ACK = 1, 确认号ack = x + 1, 初始序号seq = y),此报文也不能携带数据,同样消耗一个序号。此时服务器进入SYN-RCVD同步收到状态。
  • A收到B发出的确认报文段后,还要发出确认。确认报文段(ACK = 1, 确认号ack = y + 1, 自己的序号为seq = x + 1),此报文段可以携带数据,若不携带数据则不会消耗序号。此时A进入ESTABLISHED连接已建立状态。 B收到这个报文后也进入ESTABLISHED状态。
为什么A最后还要对B的确认发出确认?

正常情况下,如果A发出的连接请求丢失,则A超时又发送一个连接请求,B接受请求建立连接。
而如果A发出的请求连接没有丢失,而是延迟了很久。此时A超时重传一个连接请求,B同意连接然后建立了连接,数据交换后关闭连接。此时若A第一次发出的连接请求到达了B,B以为A又发出了请求,因此又建立了连接。此时A并不知道有连接建立,因此就浪费了资源。而采用三报文捂手,此时A并不会对B发出的确认进行确认,连接也就不能建立了。

TCP连接释放

  • A发出连接释放报文(FIN = 1, seq = u),之后A进入FIN-WAIT 1(终止等待 1) 状态,FIN报文即使不携带数据也会消耗一个序号。
  • B收到释放报文后发出确认(ack = u + 1, ACK = 1, seq = v),之后B进入CLOSE-WAIT(关闭等待)状态,此时从A到B这个方向的连接已经释放了,TCP处于半关闭状态,但B到A的通道还没有关闭。
  • A收到B的确认后,进入FIN-WAIT 2(终止等待 2)状态,等待B发出的连接释放报文段。
  • 当B已经没有数据向A发送时,B就发出连接释放报文段(ACK = 1, FIN = 1, ack = u + 1, seq = w),之后B进入LASK-ACK(最后确认)状态,等待A的确认。
  • A收到B的连接释放报文后,必须对此进行确认。确认报文段(ACK = 1, ack = w + 1, 自己序号seq = u + 1),然后进入TIME-WAIT(时间等待)状态,经过时间等待计时器设置的2MSL后(MSL为最长报文段寿命,建议为2分钟),A才进入CLOSE状态。而B收到A的确认后就立刻进入CLOSED状态。

为什么A必须在TIME-WAIT等待2msl?

  1. 保证A发送的最后一个ACK报文段能到达B。若这个报文段丢失,B收不到这个确认报文则会重传FIN + ACK报文,A收到这个报文后会重新再传一次ACK确认报文,并重启2MSL定时器,B收到这个报文才能进入CLOSED状态。而如果A没有在TIME-WAIT下等待2MSL,则A无法收到B重发的FIN+ACK报文,也就不会重发确认报文了,导致B就无法进入CLOSED状态。
  2. 防止已失效的连接请求报文段出现在本连接中。等待2MSL后,本连接持续时间内所产生的所有保温都从网络中消失,不会干扰其他的连接。

TCP保活计时器

  • 若客户与服务器建立连接后突然客户主机故障,此时应该有措施避免这种无效连接。服务器每收到一次客户发来的数据,就重新设置包活计时器,通常为2小时,若2小时都未收到客户数据,就发送一个探测报文,每隔75秒发送一次,若发送了10次都没回应,就关闭这个连接。

    应用层

DNS解析过程

  1. 主机向本地域名服务器进行递归查询。即如果主机询问的本地域名服务器不知道,那么本地域名服务器就以DNS客户的身份向其他根域名服务器查询(即代替源主机查询)。如果最终查询不到则报错
  2. 本地域名服务器向根域名服务器查询为迭代查询(即该域名服务器以DNS客户身份迭代的查询各个根域名服务器)

HTTP

超文本传输协议,端口默认80.</br> https://www.cnblogs.com/an-wen/p/11180076.html

  • HTTP是无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
  • HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。
  • HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

    工作过程

\1. 客户端连接到Web服务器
一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。例如,http://www.luffycity.com。

\2. 发送HTTP请求
通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。

\3. 服务器接受请求并返回HTTP响应
Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。

\4. 释放连接TCP连接
若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;

\5. 客户端浏览器解析HTML内容
客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。

常用请求方法

  • GET :提交的数据会放在URL之后,也就是请求行里面,以?分割URL和传输数据,参数之间以&相连。因而有大小限制。
  • POST:提交的数据放在HTTP包的请求体中.没有大小限制。

    响应码

  • 1xx消息——请求已被服务器接收,继续处理
  • 2xx成功——请求已成功被服务器接收、理解、并接受
  • 3xx重定向——需要后续操作才能完成这一请求
  • 4xx请求错误——请求含有词法错误或者无法被执行
  • 5xx服务器错误——服务器在处理某个正确请求时发生错误

HTTP 有以下安全性问题:

  1. 通信使用明文,内容可能会被窃听;
  2. 不验证通信方的身份,因此有可能遭遇伪装;
  3. 无法证明报文的完整性,所以有可能已遭篡改。
    HTTPs 并不是新协议,而是 HTTP 先和 SSL(Secure Socket Layer)通信,再由 SSL 和 TCP 通信。通过使用 SSL,HTTPs 提供了加密、认证和完整性保护。
    认证
    通过使用 证书 来对通信方进行认证。证书中有公开密钥数据,如果可以验证公开密钥的确属于通信方的,那么就可以确定通信方是可靠的。
    数字证书认证机构(CA,Certificate Authority)颁发的公开密钥证书,可以通过 CA 对其进行验证。
    进行 HTTPs 通信时,服务器会把证书发送给客户端,客户端取得其中的公开密钥之后,就可以开始加密过程。
    使用 OpenSSL 这套开源程序,每个人都可以构建一套属于自己的认证机构,从而自己给自己颁发服务器证书。浏览器在访问该服务器时,会显示“无法确认连接安全性”或“该网站的安全证书存在问题”等警告消息。

HTTP1.1 和 1.0的区别

  • 默认持久连接节省通信量,只要客户端服务端任意一端没有明确提出断开TCP连接,就一直保持连接,可以发送多次HTTP求
  • 管线化,客户端可以同时发出多个HTTP请求,而不用一个个等待响应
  • 断点续传
  • HTTP 1.1增加host字段
  • 100(Continue) Status(节约带宽) 客户端事先发送一个只带头域的请求,如果服务器因为权限拒绝了请求,就回送响应码 401(Unauthorized)
  • HTTP/1.1在1.0的基础上加入了一些cache的新特性,当缓存对象的Age超过Expire时变为stale对象,cache不需要直接抛弃stale对象,而是与源服务器进行重新激活(revalidation)。

HTTP2.0 的特点

a、HTTP/2采用二进制格式而非文本格式
b、HTTP/2是完全多路复用的,而非有序并阻塞的——只需一个HTTP连接就可以实现多个请求响应
c、使用报头压缩,HTTP/2降低了开销
d、HTTP/2让服务器可以将响应主动“推送”到客户端缓存中

Donate comment here