zoukankan      html  css  js  c++  java
  • 【网络】计算机网络自顶向下读书笔记

    一、应用层

    1.应用体系结构:C/S体系结构、P2P体系结构

    1)C/S客户-服务器体系结构:总有一个打开的服务器,来服务来自不同用户的请求。(web、FTP电子邮件)

    2)P2P应用程序在间断连接的主机使用直接通信。(下载器迅雷、文件共享、视频会议)

    2.网络通信的本质是:不同主机上的不同进程使用socket套接字进行通信。同一端上的进程可以通过管道 共享内存 消息队列通信。

    3.对应用服务进行分类:可靠数据传输、吞吐量、定时、安全性。

    4.应用层协议及对应底层协议:

    TCP:SMTPPOP3HTTPFTP

    UDP:  DNS

    5.HTTP大全:

    HTTP各版本差异

    HTTP字段及方法

    HTTP状态码及其他方法

    HTTPS的TLS协议

    6.get与post的区别:

    get不安全 参数都在URL上,post 参数在实体里面。导致get传参有限、参数留在历史记录中、之能接受ASCII字符。

    get head和data一起发送。post先发送header 再发送data,两次连接。

    7.cookie和session的区别:

    cookie存在客户端 session存在服务端。

    cookie存在于我们的HTTP报文里,不安全 可能被盗取本地cookie并进行cookie欺骗。

    session太多会引起服务器资源占用过多。

    session需要使用cookie里面的session id来进行识别与确认。

    8.电子邮件 异步通信媒介。三大组成:用户代理(outlook)、邮件服务器、简单邮件传输协议。

     9.SMTP负责 将邮件从发送方邮件服务器 发送到 接收方邮件服务器。

    10.电子邮件流程:

    a调用用户代理程序,并提供b的邮件地址,指示用户代理发送。

    a的用户代理发送到a的邮件服务器,放在报文队列中。

    a的邮件服务器发现新的报文,创建到b的邮件服务器的TCP连接 使用SMTP协议发送。(b服务器没开机则等待重试)

    b使用邮件访问协议如POP3来进行邮件读取。

    11.其他邮件访问协议:

    1)POP3第三版的邮局协议

    2)IMAP因特网邮件访问协议

    3)HTTP

    12.DNS因特网目录服务 运行在UDP上。

    13.DNS的作用:转换主机名IP地址、主机别名(z.cn亚马逊中国)、邮件服务器别名(@qq.com的本质很长、繁琐)

    14.DNS通过UDP的端口53发送。

    15.DNS查询过程

    dns的层次结构:根服务器、顶级域(com org edu)、权威服务器。

    16.P2P文件分发

    具体代表协议:BitTorrent

    参与一个特定文件分发的所有对等方集合叫 洪流。

    a加入洪流 会将其余对等方的IP地址发给a,a根据列表创建TCP连接,连接上的叫邻近对等方,a询问邻近对等方持有的文件块,

    发送a没有的块的请求,根据最稀缺技术,首先请求的是所有邻近对等方块副本最少的,其他邻近对等方也与a进行交换。

    称为“一报换一报”。

    17.CDN内容分发网络

    CDN管理在多个地区的服务器上 在服务器上存储视频。

    面向最终用户的内容提供设备,可缓存静态Web内容和流媒体内容,实现内容的边缘传播和存储,以便用户的就近访问。

    操作过程:在DNS解析过程中,权威服务器发送CDN域的主机名,pc开启第二个DNS请求,返回CDN的ip地址,然后开启进行连接。

    二、运输层

    18.网络层提供了主机之间的逻辑通信,运输层提供了不同主机的进程之间的通信。运输层只工作在端系统上。

    19.UDP用户数据报协议 不可靠、无连接的服务:数据交付、差错检查

    TCP传输控制协议 可靠的、面向连接的协议:可靠数据传输、拥塞控制

    可靠数据传输:流量控制、序号、确认、定时器

    拥塞控制:慢启动,拥塞避免,快重传,快速恢复

    20.网络层的IP协议是不可靠服务,尽力而交付服务。

    21.数据交付包括:复用、分解

    多路复用:将数据分组之后 装上运输层首部 传给网络层。 

    多路分解:将报文段根据套接字交付给正确的进程。

    22.UDP套接字 二元组(目的IP地址,目的端口号)

    TCP套接字 四元组(源IP 源端口号 目的IP 目的端口号)

    23.UDP的优点

    1)无需连接建立。不需要类似TCP的三次握手时延

    2)无连接状态,服务器可以支持更多的用户连接

    3)分组首部开效小 tcp首部20字节 udp首部8字节

    4)udp将数据包不分组立即打包给网络层。

    24.QUIC协议是HTTP/3的网络层协议 基于UDP 但是实现了可靠性。

    TCP利用序号来保证可靠性 丢失的报文序号和后面都需要重传为了保证顺序性。

    QUIC协议的重传是使用packet number,但是这个是永远递增的,当丢失了 会重选但是packet number还是+1

    原因是使用同一个stream使用一个offset偏移量来表示 包的位置 通过不同的偏移量 交给接受方进行组合。

    25.UDP报文段结构

     26.分组接受到再接受其他分组,否则就一直等待。——停等协议。

    允许发送方发送多个分组而无需等待确认。——流水线技术

    27.解决流水线的差错恢复的两种办法: 都是基于滑动窗口的

    1)GBN回退N步

    所有分组按顺序分为    已确认   发送,还没确认   可用,还没发送   不可用

    维护一个大小为n的窗口 

    发送方发送:

    1上层调用rdt_send() 当窗口内有可用但没发送的分组进行发送,全为发送但未确认则返回

    2收到一个分组n的ACK GBN采用累积确认 证明接受方正确收到n及以前的分组 

    3超时时间 对于某个n分组的ACK超时 发送方重传所有已发送但没确认的分组。

    接受方:

    接受到分组 则返回一个ACK

    丢弃所有失序的分组,数据必须按序交付

    2)SR选择重选

    发送方:

    每个分组都有自己的计时器 ,窗口内的分组超时后选择重传 

    接受方:

    失序的分组先缓存起来 

    缺点:接受方的窗口和发送方的窗口不一样,会因序号导致错乱。解决:窗口长度必须小于等于序号空间大小的一半。

    28.TCP协议只在端系统中运行,中间的路由器看不到TCP连接,只能看见数据报。

     首部字段的细节:

    1)32bit序号和32bit确认号 保证了tcp可靠性

    2)16bit接受窗口 用于流量控制 表示接收方愿意接受的字节数量

    3)选项:用于发送方和接受方协商MSS

    4)标志字段:ACK确认字段的值有效、SYN、FIN等

    5)4bit首部长度

    29.三次握手的细节

    1. 第一次握手:Client将SYN置1,随机产生一个初始序列号seq发送给Server,进入SYN_SENT状态;
    2. 第二次握手:Server收到Client的SYN=1之后,知道客户端请求建立连接,将自己的SYN置1,ACK置1,产生一个acknowledge number=sequence number+1,并随机产生一个自己的初始序列号,发送给客户端;进入SYN_RCVD状态;
    3. 第三次握手:客户端检查acknowledge number是否为序列号+1,ACK是否为1,检查正确之后将自己的ACK置为1,产生一个acknowledge number=服务器发的序列号+1,发送给服务器;进入ESTABLISHED状态;服务器检查ACK为1和acknowledge number为序列号+1之后,也进入ESTABLISHED状态;完成三次握手,连接建立。
    • 简单来说就是 :
      1. 客户端向服务端发送SYN
      2. 服务端返回SYN,ACK
      3. 客户端发送ACK 

    SYN洪泛攻击:多个SYN请求,不完全第三步握手,导致服务器半连接,占用资源。

    解决:使用SYN cookies,服务器不开连接不分配资源,而是传一个初始TCP序列号经过散列的cookie的SYNACK报文,如果接受到ACK则经过相同散列函数计算得到对映的ip地址、端口号,开启全连接。

    两次握手行不行?双方都要发送一个自己的序列号,需要双双确认,这样就必须3次握手,2次最多确认一个序号。

    30.四次挥手

    • 第一次挥手:Client将FIN置为1,发送一个序列号seq给Server;进入FIN_WAIT_1状态;
    • 第二次挥手:Server收到FIN之后,发送一个ACK=1,acknowledge number=收到的序列号+1;进入CLOSE_WAIT状态。此时客户端已经没有要发送的数据了,但仍可以接受服务器发来的数据。
    • 第三次挥手:Server将FIN置1,发送一个序列号给Client;进入LAST_ACK状态;
    • 第四次挥手:Client收到服务器的FIN后,进入TIME_WAIT状态;接着将ACK置1,发送一个acknowledge number=序列号+1给服务器;服务器收到后,确认acknowledge number后,变为CLOSED状态,不再向客户端发送数据。客户端等待2*MSL(报文段最长寿命)时间后,也进入CLOSED状态。完成四次挥手。

    简单来说:

    • 客户与服务器交谈结束之后,客户要结束此次会话,就会对服务器说:我要关闭连接了(第一 次挥手)
    • 服务器收到客户的消息后说:好的,你要关闭连接了。(第二次挥手)
    • 然后服务器确定了没有话要和客户说了,服务器就会对客户说,我要关闭连接了。(第三次挥 手)
    • 客户收到服务器要结束连接的消息后说:已收到你要关闭连接的消息。(第四次挥手),才关闭

    为什么要四次挥手?close_wait的意义是什么?

    • 因为服务器收到客户端断开连接的请求时,可能还有一些数据没有给客户端发完,这时先回复ACK,表示接收到了断开连接的请求。等到数据发完之后再发FIN,断开服务器到客户端的数据传送。(服务器端:客户端你让我断我就断啊,我这还没完事呢,等会再说)

    TIME_WAIT的状态意义是什么?

    第四次挥手时,客户端发送给服务器的ACK有可能丢失,TIME_WAIT状态就是用来重发可能丢失的ACK报文。
    如果Server没有收到ACK,就会重发FIN,如果Client在2*MSL的时间内收到了FIN,就会重新发送ACK并再次等待2MSL,防止Server没有收到ACK而不断重发FIN。 MSL(Maximum Segment Lifetime),指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间(发送ACK 接受FIN)。
    如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。
    为什么要等2MSL?
    ACK不消耗序号,所以不是可靠的,不能重传。所以必须要等到重传的FIN过来 才能再传ACK。
    2MSL=发送的ACK丢失1MSL,重传过来的FIN1MSL。
     

    30.TCP的报文长度:长度受限于MSS最大报文段长度,MSS受限于MTU最大链路层帧长度。

    31.TCP协议只在端系统中运行,中间的路由器看不到TCP连接,只能看见数据报。

    32.在Java中的socket是外观模式,为我们隐藏了很多TCP/IP协议的细节。

    33.scoket通信过程:

    • 基于TCP:服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。

    • 基于UDP:UDP 协议是用户数据报协议的简称,也用于网络数据的传输。虽然 UDP 协议是一种不太可靠的协议,但有时在需要较快地接收数据并且可以忍受较小错误的情况下,UDP 就会表现出更大的优势。我客户端只需要发送,服务端能不能接收的到我不管


    34.TCP使用端到端的拥塞控制,而不是网络辅助的拥塞控制,因为IP层不提供任何显示的拥塞反馈。
    35.TCP拥塞控制算法:
    1)慢启动:
    TCP起始发送速率慢,在慢启动阶段以指数增长:MSS从1开始 ,每经过一个RTT,发送速率就会翻倍。
    慢启动的结束事件:
    1由超时引起的丢包事件,将cwnd发送方的拥塞窗口重置1,并将阈值设置为拥塞发送时窗口的一半。
    2当窗口达到了阈值(前拥塞发生时的一半),结束慢启动,进入拥塞避免阶段。
    3收到3个冗余ACK,TCP进行快速重传,并进入快速恢复模式。
    2)拥塞避免:
    进入拥塞避免模式,每次只增加1个MSS,线性增长。
    结束事件:
    1超时丢包时,阈值设置为拥塞窗口的一半。
    2收到3个冗余ACK,将阈值设置为窗口的一半,进入快速恢复。
    3)快恢复:
    如果网络出现拥塞的话就不会收到好几个重复的确认,所以发送方现在认为网络可能没有出现拥塞。所以此时不执行慢开始算法,而是将cwnd设置为ssthresh减半后的大小,然后执行拥塞避免算法
    4)快重传:
    快重传算法规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计时器时间到期。
     
  • 相关阅读:
    【Mysql学习笔记】浅析mysql的binlog
    HBase 学习笔记---守护进程及内存调优
    字符集例子-同一字符不同字符集编码不同及导入导出的乱码
    随机访问
    格式化的代价
    读写文本文件
    缓冲
    加速I/O的基本规则
    序列化再探讨
    数据库I/O:CMP、Hibernate
  • 原文地址:https://www.cnblogs.com/cckong/p/14619591.html
Copyright © 2011-2022 走看看