网络基础(下篇)
作者 | 孙超
编辑 | 徐广欣
tips2:运输层网络协议、应用层网络协议、网络相关参考资料~
复用:在发送方不同的应用进程都可以使用同一个运输层协议传送数据。
分用:接收方的运输层在剥去报文的首部后能够把这些数据正确的交付目的应用进程。
a. 用户数据报协议 UDP
无连接。
尽最大努力交付。
面向报文的。对于应用层的报文,添加首部后就直接交付IP层。
UDP没有阻塞控制,网络阻塞不会使源主机的发送速率降低。IP电话会中断,但不会延迟。
支持一对一、一对多、多对一和多对多的交互通信。
首部开销小,只有8个字节。TCP有20个字节。首部由四个字段组成,每个字段2个字节。
源端口:在需要对方回信时选用。不需要时为0。
目标端口:在终点交付报文时必须使用。
长度:UDP报文的长度,最小值只有8,即仅有首部。
检验和:检测UDP在传输时是否有错。
b. 传输控制协议 TCP
面向连接
应用程序在每一次使用TCP协议前,必须先建立 TCP 连接,当数据传输完毕后,释放已建立的连接。整个过程分为三个阶段。
连接端点(endpoint),叫做套接字 Socket,即 :Socket =(IP地址:端口号)。TCP连接 = (socket1, socket2) ==> (ip1:port1, ip2:port2)。
建立连接
传输控制块
TCP模块中有一个TCB(传输控制模块,Transmit Control Block),它用于记录tcp协议运行过程中的变量。对于有多个连接的tcp,每个连接都有一个tcb。tcb结构的定义包括这个连接使用 的源端口[1]、目的端口、目的ip、序号、应答序号、对方窗口大小、己方窗口大小、tcp状态、top输入/输出队列[2]、应用层[3]输出队列、tcp的重传有关变量。
三次握手
客户A向B发送报文请求,TCP首部 SYN=1,携带一个初始序号 seq=x。此时 SYN=1 情况下,不能携带数据,但消耗一个序号。当前 TCP client 进程的状态 SYN-SENT(同步已发送)。(第一次握手)2.服务器B收到请求,同意建立连接,向A发送确认,确认报文 SYC=1,ACK=1,确认号是 ack=x+1,并携带一个初始序号 seq=y,不能携带数据,但消耗一个序号。当前 TCP 服务进程的状态是 SYN-RCVD(同步已接收)。(第二次握手)3.TCP Client 进程收到 B 的确认后,再次向 B 发送确认。ACK=1,确认号是 ack=y+1,序号 seq=x+1。(可携带数据,也可不携带【不消耗序号,下一个序号仍是 seq=x+1】),A 进入 ESTABLISHED 状态。B收到确认后也进入 ESTABLISHED 状态。(第三次握手)
释放连接(四次握手)
TCP 状态机
方框:TCP状态。
箭头:状态变迁。
箭头旁边的字:1.引起状态变迁的原因。2.发生状态变迁后出现的动作。
粗实线箭头:客户进程的正常变迁。
粗虚线箭头:服务器进程的正常变迁。
细线箭头:异常变迁。
全双工通信
TCP 允许通信双方的应用进程在任何时候都能发送数据。TCP 连接的两端都设有发送缓存和接收缓存,用来临时存放双方通信的数据。
面向字节流
流入到进程或从进程流出的字节序列。一个TCP报文段包含很多的字节序列。
TCP报文段首部信息
源端口和目标端口:各占2个字节。
序号 seq
占4个字节,共2^32个序号,即4294967296个序号。当序号到达 **2^32 - 1** 后,下
一个序号为0。也称为 “报文段序号”,是所发送的数据的第一个字节的序号。
seq=301,len(data)=100, 下一次seq=401
确认号 ack
占4个字节,是期望收到对方下一个报文段的第一个数据字节的序号。确认号N表明,N-1的所有数据都已经正确收到。
数据长度 100
A -> B --> seq = 201
B ack --> ack = seq + len(data) = 301
数据偏移
占4位,TCP报文段中,首部的长度。即,数据起始位置 到 报文起始位置 的距离。
保留
占6位,为日后使用,目前都是0。
控制位6个
URG,数据指针紧急程序,1最高。
ACK,当ACK=0,ack 无效,ACK=1时,有效。建立连接后所有发送的报文段必须设置ACK=1。
SYN,SYN=1 表示一个连接请求报文(SYN=1,ACK=0) 或 一个连接接收报文(SYN=1,ACK=1)。
FIN,用来释放一个连接。FIN=1,报文段的放送方数据已经发送完毕,并要求释放连接。
RST,复位。RST=1,TCP连接中出现差错,必须释放连接,然后重新建立运输连接。
窗口,也叫接收窗口,放送方允许对方发送的数据量(自己的接收能力)。是接收方让发送方设置其发送窗口的依据。
ack=701, window=1000 --> 放送方从701号起,还能接收1000个字节数据的接收缓存空间。
传输原理
IP层的传输是尽最大努力交付的,那么就无法保证可靠传输。而 TCP 协议会通过适当的措施使得两个运输层之间的通信变得可靠。
停止等待协议
每发送完一个分组就停止发送,等待对方的确认。此协议简单,但信道利用率太低。
超时重传
发送方在发送分组后,超过一定的时间没有收到确认,因此需要重新发送分组。具体实现是在每发送完一个分组设置一个超时计时器。超过计时器没有收到确认,就重传;收到确认,清楚计时器。
每次发送后,暂存发送的副本。
分组的发送和确认都必须进行编号。为了定位具体的分组。
超时计时器设置的时间应该比 RTT 时间长,因为网络的不确定性。
流水线传输
为了提高传输效率,发送方可连续发送多个分组,不必每发完一个分组就停止发送等待接收方的确认。
连续ARQ协议
发送方维持一份发送窗口(每个窗口中有多个按序号连续的分组),窗口内的分组可以连续发送,不需要等待接收方的确认。
接收方采用**累积确认**的方式。在收到几个分组后,对按序到达的最后一个分组发送确认。表示:到这个分组为止的所有分组都已经正确的收到了。
滑动窗口协议
滑动窗口以字节为单位,主要依据 确认号ack 和 窗口。
A 收到 B 的确认, ack=31,窗口=20
为收到B确认,A连续发送窗口的数据,但要缓存,为了超时重传。
由于网络损耗,A的发送窗口应该要 <= B的接收窗口。
不按序到达的数据,先临时存放到接收窗口中,等为接收的字节流收到后,再按序交付。
流量控制
让发送方的发送速率不要太快,使接收方来的及接收。发送窗口 <= 接收窗口。
拥塞控制
防止过多的数据进入网络,使路由器或链路不致过载。是全局性的控制。
在某段时间内,对网络上某个资源的的需求超过了该资源所能提供的可用部分时,网络的性能下降,出现**拥塞**,整个网络的吞吐量下降。当 **吞吐量=0** 时,网络无法工作,成为 **死锁。**
每个应用层协议都是为了解决某一类具体的问题,问题的解决要通过位于不同主机上的多个应用进程之间的通信和协同工作来完成。应用层的具体内容就是精确的定义这些通信规则(协议)。应用层的许多协议都是基于Client-Server方式的。Client 是服务的请求方,Server 是服务的接收方。
a. DNS
主机向本地DNS服务器的查询一般都采用递归查询。
本地DNS服务器向根DNS服务器查询一般采用迭代查询。
具体步骤
高速缓存DNS,存放最近查询过的域名以及从何处获取域名映射的记录。
b. FTP
工作原理
一个FTP服务器进程分为两大部分:
主进程:一个进程,负责接收新的请求。工作步骤如下:
打开21端口。
等待Client请求连接。
启动从属进程来处理Client的请求。从属进程处理完毕后就终止。
回到等待状态。
从属进程:多个进程,负责处理单个请求,并发的。文件传输时,建立两个 TCP 连接,控制连接 和 数据连接。
URL,统一资源定位符。<协议>://<主机>:<端口>/<路径>。
HTTP协议,超文本传输协议。
HTML。
代理服务器
WWW的高速缓存。将最近的一些请求和响应暂存在本地磁盘。加快访问速度。
e. DHCP
主机A启动时,向DHCP中继代理服务器广播发送报文。数据报中源地址都是0,目标地址都是1。
DHCP中继代理服务器将报文以单播的方式转发到 DHCP服务器,等待答复。
DHCP服务器分配给DHCP客户的IP地址是临时的,租用期(lease period)有DHCP服务器决定。
三. 参考资料
•网络编程:https://blog.csdn.net/maydaysar/article/details/58204104
References
[1]
源端口: https://baike.baidu.com/item/%E6%BA%90%E7%AB%AF%E5%8F%A3[2]
队列: https://baike.baidu.com/item/%E9%98%9F%E5%88%97[3]
应用层: https://baike.baidu.com/item/%E5%BA%94%E7%94%A8%E5%B1%82
让我知道你在看