标签:内容 更新 cli inf 系统 设置 for ack blog
这是我在Coursera上的学习笔记。课程名称为《Computer Networks》,出自University of Washington。
因为计算机网络才诞生不久,眼下正在以快速在发展,所以有些旧的教材可能都已经跟不上时代了。这门课程在2013年左右录制,知识相对还是比較新的。覆盖了计算机网络中的各个协议层,从物理层到应用层都讲得很细致。
学完这门课程之后对计算机网络会有比較深刻的了解。
传输层概述
课程位置
我们已经到达传输层了
传输层基于网络层
回顾
传输层是端到端的通信,中间的路由过程不会改变传输层的数据
应用数据包括在TCP包中,TCP包包括在IP包中。IP包包括在帧中
传输层提供的服务
提供框中不同的传输数据方式:UDP TCP
UDP和TCP的比較
TCP拥有所有特性,UDP仅仅是名义上的传输层。
TCP全部的字节仅仅传输一次,按顺序。UDP消息可能会乱序,反复。丢失
TCP支持随意长度的内容。UDP仅仅能支持有限长度的内容
TCP发送者和接受者能同步流的控制。
UDP无视网络状态,能够随意发送
TCP能够控制堵塞。UDP无视网络状态,能够随意发送
SOCKET API
简单的网络抽象接口
支持UDP和TCP
SOCKET同意不同的应用使用不同的port
UDP和TCP的接口是一样的。除了LISTEN ACCEPT CONNECT是TCP特有的接口,其它接口都是一样的。
port
应用程序之间通过IP地址、协议、port来区分不同的应用
server通常将port绑定到公认的port上(port号<1024)
client通常使用暂时port
公认port
20 21 FTP
22 SSH
25 SMTP
80 HTTP
110 POP3
143 IMAP
443 HTTPS
543 RTSP 多媒体控制
631 IPP 打印机共享
话题
UDP TCP 连接 滑动窗体 流控制 重发计时器
UDP
话题
用UDP发送消息
UDP
在不须要可靠连接的情况下使用UDP
比方VoIP DNS RPC DHCP
数据报SOCKET
client。服务端都调用SOCKET
服务端调用BIND
服务端调用RECV FROM(堵塞)
client调用SENDTO
client调用RECVFROM(堵塞)
服务端调用SENDTO
client和服务端都调用CLOSE
UDP缓冲
操作系统接收到数据包时会将数据包保存到内存中,当应用调用RECVFROM时,操作系统会将内存中的数据包传递给应用。这样。应用处理一个数据包时,即使收到数据报也不会丢包
UDP包头
使用port来区分不同的应用
UDP最长长度为64K
有16位CHECKSUM
详细格式:Source Port | Dest Port | UDP Length | UDP Checksum
checksum是可选的,假设是0表示没有校验。(IPv6不可选)
checksum覆盖IP地址字段
UDP check sum计算过程
When UDP runs over IPv4, the checksum is computed using a "pseudo header"[9] that contains some of the same information from the real IPv4 header. The pseudo header is not the real IPv4 header used to send an IP packet, it is used only for the checksum calculation.
Offsets | Octet | 0 | 1 | 2 | 3 | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Octet | Bit | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
0 | 0 | Source IPv4 Address | |||||||||||||||||||||||||||||||
4 | 32 | Destination IPv4 Address | |||||||||||||||||||||||||||||||
8 | 64 | Zeroes | Protocol | UDP Length | |||||||||||||||||||||||||||||
12 | 96 | Source Port | Destination Port | ||||||||||||||||||||||||||||||
16 | 128 | Length | Checksum |
The source and destination addresses are those in the IPv4 header. The protocol is that for UDP (see List
of IP protocol numbers): 17 (0x11). The UDP length field is the length of the UDP header and data.
UDP checksum computation is optional for IPv4. If a checksum is not used it should be set to the value zero.
当UDP执行于IPv4时,checksum通过虚拟报头进行计算。虚拟报头中包含了IPv4中的一些字段。虚拟报头不会在数据的传输过程中出现,它仅仅是用来计算checksum。
Source Addr和Dest Addr来自IPv4。UDP protocol为UDP协议号17。UDP length是原来UDP报头中的字段。
UDP checksum在IPv4中是可选的。
假设checksum没实用到,那么它应该设为0。
建立连接
话题
怎样建立连接
建立链接
在通信前。发送方和接收方都须要向对方建立连接。
三次握手
client生成随机的ISN初始序列号,并向服务端发送SYN(x)
服务端回应客户的请求。生成一个随机的ISN。并向client发送SYN(y)ACK(x+1)
client回应ACK(y+1)
SYN假设中途丢失,会又一次发送
序列号和ACK号会在兴许的数据包中用到
即使SYN或ACK延迟、反复,TCP也能提供可靠的连接
TCP连接有限状态机
见图
状态:CLOSED LISTEN SYN_SENT SYN_RECV ESTABLISHED
有限状态机是一种帮助考虑全部情况的有利工具
TCP同意一次有多个连接
释放连接
话题
怎样释放连接
释放连接
有序地释放连接
关键问题是怎样提供可靠的释放机制
TCP通过对称的释放机制。服务端和client独立释放连接
步骤
主动方发送FIN(X),被动方发送ACK
被动方发送FIN(Y)。主动方发送ACK
FIN假设中途丢失,会又一次传输
每对FIN ACK仅仅关闭一个方向的连接
TCP释放有限状态机
ESTABLISHED
FIN_WAIT_1:等待ACK
FIN_WAIT_2:等待对方的FIN
TIME_WAIT:为了提高可靠性。关闭连接之后要等待一段时间
CLOSED
CLOSE_WAIT
LAST_ACK
TIME_WAIT
关闭连接之后等待非常长一段时间。一般是分段生命周期的两倍,也就是2分钟。
由于ACK可能会丢失,这样做是为了让关闭连接更可靠
假设不等待,可能兴许的连接会影响到本次连接
TCP连接有限状态机
TCP释放有限状态机
滑动窗体
话题
滑动窗体算法
提高可靠性
基于STOP-AND-WAIT
回顾
ARQ协议要求每次发送都须要对方回复ACK,在等待对方回复的时间里,发送方没有传输数据,这样就造成了带宽的浪费
STOP-AND-WAIT的限制
一次仅仅能发送一包消息,会造成带宽的浪费
滑动窗体
是STOP-AND-WAIT算法的升级版
同意一次发送W个数据包
W=2*带宽*延迟/数据包大小
滑动窗体协议
分为两种:GO-BACK-N、SELECTIVE-REPEAT
TCP使用SELECTIVE-REPEAT
发送方
当未确认的包小于W时,发送方能够不停地发送数据,直到未确认的包大于W
GO-BACK-N
接收方仅仅记录最后ACK的帧号LAS。
当另外一个ACK到达时,假设ACK号为LAS+1。那么将LAS添加1,否则就丢包
SELECTIVE-REPEAT
在内存中建立W个缓冲,记录每一个包的状态
当ACK到达后更新包的状态
重发
GO-BACK-N使用一个计时器来检測数据包的丢失
SELECTIVE-REPEAT使用W个计时器来检測丢包
序号
序号的范围是多少比較合适呢
序号随时间变化的图
流控制
话题
在滑动窗体算法中添加流控制
防止发送者发送太快
问题
滑动窗体能够充分利用带宽,可是假设接收方无法处理太大量的数据,怎么办呢
接收方
发送方已经接收到数据了。可是没有调用RECV接口。这样的情况下数据包的ACK不会发送,服务端也不会发送很多其它数据
接收方能够直接告诉发送方它能接受的缓冲区大小。WIN=#ACCEPTABLE
流控制
TCP中有WIN字段,就是用来流控制的
样例
发送方发送2K数据,SEQ=0
接收方ACK=2048,WIN=2048
发送方发送2K数据,SEQ=2048
接收方ACK=4096。WIN=0
发送方不发送数据,由于WIN是0。表示对方无法接收数据
接收方ACK=4096。WIN=2048
发送方发送1K数据,SEQ=4096
超时重发
话题
怎样设置超时重发
重发
在滑动窗体算法中。检測丢包就是通过超时来实现的
超时问题
多久才算超时呢?
在LAN中非常好确定超时时间。由于能够通过RTT(RoundTripTime)来推导,可是在Internet中非常难确定超时时间,由于互联网延迟每一个地方都不一样,RTT都是有差别的。主要原因在于数据包排队
因为网络延迟会变化,所以须要将超时时间自己主动适应不同的网络环境
自适应的超时时间
SRTT(n+1) = 0.9*SRTT(n) + 0.1*RTT(n+1)
Svar(n+1) = 0.9*Svar(n) + 0.1*|RTT(n+1)-SRTT(n+1)|
TCP超时时间(n)=SRTT(n)+4*Svar(n)
SRTT = 平滑RTT
这样的方法计算简单。对于性能和健壮性来说这样的方法非常重要
TCP
话题
TCP怎样工作
TCP特性
可靠的字节流
基于连接
使用滑动窗体提高可靠性
流控制
通过堵塞控制来分配网络带宽
可靠的字节流
client调用四次send函数。接收方可能调用一次recv就把全部的消息都接收完成。由于TCP是字节流,分界点不依靠send
数据双向传递
TCP头部格式
见表格
TCP滑动窗体 - 接收方
通过递增的ACK告诉发送方。下一个数据包的序号是什么
SELECTIVE ACK让发送方得知接收状态
TCP滑动窗体 - 发送方
使用自适应的超时重发来又一次发送数据
依据ACK的状况推測丢包情况。马上重发数据。这样做能够避免超时重发的发生
TCP头部
SYN/FIN/RST 标志是用于连接的
WINDOW SIZE 是用于流量控制的
其它TCP细节
TCP会有许很多多奇怪的问题,可是这些都属于细节了
最大的问题就是堵塞控制了,下一章将会讲到
Offsets | Octet | 0 | 1 | 2 | 3 | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Octet | Bit | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
0 | 0 | Source port | Destination port | ||||||||||||||||||||||||||||||
4 | 32 | Sequence number | |||||||||||||||||||||||||||||||
8 | 64 | Acknowledgment number (if ACK set) | |||||||||||||||||||||||||||||||
12 | 96 | Data offset | Reserved 0 0 0 |
N S |
C W R |
E C E |
U R G |
A C K |
P S H |
R S T |
S Y N |
F I N |
Window Size | ||||||||||||||||||||
16 | 128 | Checksum | Urgent pointer (if URG set) | ||||||||||||||||||||||||||||||
20 ... |
160 ... |
Options (if data offset > 5. Padded at the end with "0" bytes if necessary.) ... |
标签:内容 更新 cli inf 系统 设置 for ack blog
原文地址:http://www.cnblogs.com/zhchoutai/p/6897996.html