[版权声明] 本站所有资料由用户提供并上传,若内容存在侵权,请联系邮箱。资料中的图片、字体、音乐等需版权方额外授权,请谨慎使用。网站中党政主题相关内容(国旗、国徽、党徽)仅限个人学习分享使用,禁止广告使用和商用。
将一个数据包分为多段(在应用层),并为每个数据封装加入头部数据生成一个segment报文段,通过socket接口发送给网络层
收到多个报文段,传输层根据头部数据的目标端口号分给不同的socket,再给到相应的进程
跟目标的ip地址和端口号有关,跟源地址和端口号无关
会为每个连接开启不同的socket
服务端有主进程,当外部有报文进来的时候,主进程会创建一个子进程与之通信,所以一个主进程会对应多个socket,每个socket通过四元组属性标识一个源主机(的某个socket)
一般采用多线程机制,线程耗用资源比进程少得多
一个进程对应多个线程,一个线程对应一个socket
可以令数据在不可靠的信道上进行可靠传输
rdt_send():接受应用层数据,并发送给rdt协议
udt_send() :被可靠传输协议调用,在不可靠信道中传输数据
rdt_rcv() :接收到不可靠信道中数据,并发送给rdt协议
事件或者操作引起状态1向状态2转变
考虑错误,但不考虑丢包
解决重复接受分组报文→加入分组序号
既考虑有错误,也有丢包
收到非预期的(或者重复的)应答报文:
//什么都不做,等待计时器超时
当该报文的计时器超时:
收到预期的肯定应答报文:
//当出现延迟而重复接受分组报文的时候,
因为不能及时收到应答报文,将会重传分组报文,接受方也会重复收到分组报文,因此也会重复发送应答报文
a.当接收方接受到一个pkt报文时,会对序号为n的分组的确认采取累积确认的方式, 即接受方发送连续的、拥有最高序列号的分组的ACK,表明自己已正确接收到序号≤n的所有分组。
b.重传:发送方每发送一个pkt报文,都会为其设置一个计时器,当计时器超时时将会选择重传该报文
c.产生重复的ACK:乱序到达的分组直接丢弃(接收方无需缓存)重新确认序列号最大的、按序到达的分组
d.缓存:接收到无序的报文时会立即抛弃,接收方没有缓冲区,发送方会设立缓存区保存上层应用发来的数据
a.发送方:当从上层接收到数据后,发送方检查下一个可用于该分组的序号,如果序号位于发送方的窗口内,则将数据打包并发送,否则将缓存起来
send_base:基序号(序号最小的已发送报文
nextseqnum:下一个可用的分组序号
b.窗口前移:收到的ACK报文序号等于发送窗口基序号send_base(窗口中最左边的那个序号), 则整个窗口向前移动到具有最小序号的未确认处
c.缓存:接收到无序的报文时会检查该报文序号是否在接受窗口内([rcv_base, rcv_base + N-1] )如果该分组以前没收到过,则缓存该分组,并发送ACK报文。如果该分组序号已经存在,或者是在基序号之前的已接受的分组,也还要重新发送ACK报文。如果是按序到达的(分组序号等于rcv_base基序号),则将以前缓存过的所有连续分组发送给应用。
d.窗口大小:发送方和接收方窗口大小之和应该小于2的k次幂,k是序列号的位数,例如有0,1,2,3四个序号能用两个比特位表示00,01,10,11,k就等于2。如果发送窗口第一个分组没有收到ACK报文的话,就不能往前滑动,必须等到基序号的分组收到ACK报文。
UDP的校验和 = 伪首部 + 首部 + 数据部分,一起都检验
UDP检验和的计算方法是:
source port :源主机端口号(占用两个字节16位)
dest port :目标主机端口号(占用两个字节16位)
sequence number :本报文数据中(application data)的第一个字节在数据流中的序号 ,一般的起始序号是随机生成的(占用四个字节32位)
acknowledgement number :接收方期望收到的下一个报文数据第一个字节的序号(占用四个字节32位)
head length :报文首部长度 / 数据偏移地址。(占用4位)偏移地址最长60字节 ???
not used:保留字段(占用6位)
URG :紧急字段,值为1时紧急数据(urg data)有效(占用1位)
ACK :确认应答,值为1时为确认应答报文(占用1位)
PSH :立即提交字段,值为1时将尽快提交该报文(占用1位)
RST :重连字段,重新建立连接(占用1位)
SYN :同步字段,值为1时表示该报文是连接请求(占用1位)
FIN :终止标志字段,值为1时释放该连接(占用1位)
receive window :窗口字段,表示接收方缓存的大小(占用两个字段16位)
checksum :校验和字段(占用两个字段16位)
Urg data point :应急数据指针字段,指向应急数据最后一个字节,表明了它的大小,应急数据通常是在数据刚开始的地方(占用两个字段16位)
options:选项字段(长度可变,加入填充字段令其严格等于32位的倍数)
发送方序号seq是42,并且只发送了一个字节”C“,因此接收方返回的ACK是42+1=43,发送方的ACK表示其下一次预期收到的seq序号,即seq=79
同理,发送方收到接收方的报文后,因为还是传输的一个字节,再次发送报文
TCP可靠传输建立在不可靠传输链路上:
在建立连接的三次握手中,发送方会在握手包中附带 receive window 缓冲区大小参数 ,以限制发送方传输的速率
其原因是由于TCP的头部窗口字段只有16bit,最多表示64k,为了表示更大的窗口,使用了可选的放大倍数
cwnd参数用于慢启动机制中,表示发送方在得到接收方确认前,最大允许传输的未经确认的数据(拥塞窗口大小),它不出现在TCP报文中,是发送方的内部参数。
cwnd 参数是根据网络情况动态调节的。关于cwnd拥塞窗口介绍在下文的 八-4 中有更详细的介绍。
再运行客户端发送端口:
TCP的三次握手机制:
SYN 同步标识位置1表示这是一个握手包
Seq是该报文的序号,其初始值x、y是随机生成的,防止被攻击
ACK确认标识位置1表示接收方收到报文,ACKnum有效
ACKnum是确认序号,也是下一次期待接受的序号 x+1 (x为接收到报文的Seq加上接收到的报文的长度)
当FIN置1时,表示该报文请求关闭连接
发送方在收到接收方的应答报文后不再主动发送数据,而是在一段时间内等待接收方再次发送一个请求关闭的报文,这是防止在关闭过程中有丢包,如果超时了没收到,就会重发带FIN置1的关闭报文。
发送方通过判断是否丢包严重 / 时延过大,来确定是否产生了拥塞
路由器向发送方提供网络情况反馈,
按照拥塞控制方法的不同,现行使用的TCP分为几个版本:Tahoe,Reno,NewReno,Vegas,SACK 等。
下面主要讲的是Reno版本的TCP拥塞控制机制。
通过控制拥塞窗口(发送窗口)的大小来控制发送速率。
TCP拥塞控制机制方法主要分为如下4个阶段:
虽然流量控制可以避免发送方过载接收方,但是却无法避免过载网络,这是因为接收窗口「rwnd」只反映了服务器个体的情况,却无法反映网络整体的情况。cwnd 参数的初始值往往比较小,然后随着数据包被接收方确认,窗口成倍扩大,所以被称为慢启动
那么红色部分就是随着「cwnd」的增加,当出现网络过载,丢包后,「cwnd」的大小会减少至一半,即把cwnd增加的阈值。
[版权声明] 本站所有资料由用户提供并上传,若内容存在侵权,请联系邮箱。资料中的图片、字体、音乐等需版权方额外授权,请谨慎使用。网站中党政主题相关内容(国旗、国徽、党徽)仅限个人学习分享使用,禁止广告使用和商用。