letangers
letangers


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 搜索

滑动窗口协议

发表于 2018-06-01 | 分类于 tcp
阅读时长 ≈

整理tcp相关知识,这是第三篇。



TCP的滑动窗口是以字节为单位的。

对于A和B的连接,现在假设只有A在发送数据,而B给出确认。

发送窗口和接收窗口

发送缓存和发送窗口

A作为发送方存在一块发送缓存,发送缓存存放:
①发送应用程序传给发送方TCP准备发送的数据
②TCP已发送但未收到确认的数据

A的发送窗口:在没收到B的确认时,A可以连续把窗口内的数据都发送出去,已发送的数据在没收到确认时都要暂时保留用以超时重传。(个人理解发送窗口就是相对已确认的最后一个序号的偏移量,在这个偏移量之内的数据可以发送出去)

发送窗口通常只是发送缓存的一部分。已被确认的数据应该从发送缓存中移除,所以发送缓存和发送窗口的后沿是重合的。

发送窗口的位置由前沿和后沿的位置共同决定。后沿后面的部分表示已经发送并且收到了确认,前沿之前表示不允许发送的数据,前沿和后沿之间就是窗口大小。

接收缓存和接收窗口

B作为接收方存在一块接受缓存,接受缓存存放:
①按序到达尚未被接收应用程序读取的数据
②未按序到达的数据

B的接收窗口:从最后一个确认号算起,B还能够接收的数据。

滑动窗口

A向B发送连续的数据,如果B收到的数据是
(1) 按序到达的,则对最后一个序号发送确认
(2) 如果B没有按顺序收到数据,通常接收方会临时存放在接收窗口中,等待收到字节流中缺少的部分之后再按序交付上层应用进程
(3) 收到的分组检测到有差错,那么就丢弃该分组

如果A长时间收不到B发回确认,则A认为B没有收到这些数据,经过一段时间之后(由超时计时器控制)A就会重传未确认的数据,重新设置超时计时器,直到收到B的确认。当A收到的确认号落在发送窗口内,A就可以向前滑动发送窗口,并发送新的数据。

流量控制

接收方在给发送方发送确认时,会通告发送方接收窗口的大小,从而改变发送方的发送窗口,实现了控制发送方的发送速率。这就是流量控制。


三次握手和四次挥手

发表于 2018-05-31 | 分类于 tcp
阅读时长 ≈

整理tcp相关知识,这是第二篇。


三次握手

  1. 首先B的服务器进程创建传输控制块TCB,等待客户端的连接请求。此时服务端处在LISTEN(监听)状态

  2. A的客户进程同样要先创建TCB,然后向B发送连接请求报文段(SYN为1,选择一个初始序号a,且此报文段不携带数据,但消耗一个序号),这时A进入SYN-SENT(同步已发送)状态

  3. B收到请求后,向A发送确认(SYN和ACK都为1,确认号为a+1,同时为自己选择一个初始序号b,同样不携带数据,消耗一个序号),B进入SYN-RCVD(同步收到)状态

  4. A收到B的确认之后,再向B发送确认(ACK为1,确认号为b+1,自己的序号为a+1,如果不携带数据不消耗序号),A进入ESTABLISHED(已建立连接)状态

  5. B收到A的确认之后也进入STABLISHED(已建立连接)状态。

四次挥手

  1. A的应用进程向其TCP发送连接释放报文段,并停止发送数据。(FIN为1,即使不携带数据也要消耗一个序号)A进入FIN-WAIT-1(终止等待1)状态

  2. B收到连接释放报文后即发送确认,进入CLOSE-WAIT(关闭等待)状态。此时可以认为A向B发送数据的连接已经被拆除了,TCP连接处于半关闭状态

  3. A收到来自B的确认进入FIN-WAIT-2(终止等待2)状态

  4. 当B没有数据要发送给A时,发送连接释放报文段(FIN为1,重复上次已经发送过的确认号),B进入LAST-ACK(最后确认)状态

  5. A收到B的连接释放报文后发送确认,进入TIME-WAIT(时间等待状态)

  6. B收到A的确认之后就进入CLOSED(关闭)状态

  7. A在TIME-WAIT状态必须等待时间等待计数器设置的2MSL之后才能进入CLOSED状态。MSL叫最长报文段寿命。(设置MSL是为了保证A最后发送的确认能到达B,如果B没收到会重传连接释放报文段;同时防止网络中存在已经失效的连接报文,在2MSL的时间内可以使本连接产生的所有报文都从网络中消失)



tcp报文格式

发表于 2018-05-31 | 分类于 tcp
阅读时长 ≈

整理tcp相关知识,这是第一篇。



tcp报文格式:

1.源端口和目的端口:加上ip首部的源ip与目的ip可以唯一确定一个tcp连接。

2.序号:该报文中第一个字节的序号(tcp是给每个字节都编号的)

3.确认号:ack为1时有效,表示期望收到的下一个字节的序号。
(就是告诉对方,下次要从哪个字节开始给自己发数据)

4.保留位:必须为0

5.URG:值为1时表示紧急指针有效

6.ACK:值为1时确认号有效

7.PSH:值为1表示接收方应该尽快将这个报文上交应用层

8.RST: 连接重置

9.SYN: 同步序号,用来发起一个连接

10.FIN: 表示终止一个连接

11.窗口:该报文发送方的接收窗口大小(窗口其实就是个偏移量)

12.校验和:检验伪首部+首部+数据部分

13.紧急指针:URG为1时有效,指出本报文段紧急数据的字节数。(即使窗口为0,也可以发送紧急数据)

14.选项:长度可变,最长40个字节
(1)最大报文长度(MSS):每个tcp报文段中数据部分的最大长度(应该尽可能的大,只要在ip层传输时不分片就行,若主机未填写默认时536字节)

(2)窗口扩大选项:占三个字节,为了扩大窗口。有一个字节表示移位值S,S允许的最大值为14,即窗口最大可增大为2的30次幂减1

(3)时间戳选项:10个字节。有两个作用,一是计算往返时间RTT,二用于处理TCP序号超过2的32次幂的情况(称为防止序号绕回PAWS)

(4)选择确认选项SACK:双方商定好允许SACK之后,用来报告收到的不连续的字节块的边界(最多指明4个字节块),这样发送方就可以不再重复发送已收到的数据。然而SACK文档并没有指明发送方应该怎样响应SACK,因此大多数的实现还是重传所有未确认的数据块。

排序(1)

发表于 2018-05-30 | 分类于 algorithm , sort
阅读时长 ≈

最近心血来潮,想把学过的数据结构和算法实现一遍。

这是第二篇。

内容有各种排序

线性表

发表于 2018-05-29 | 分类于 algorithm , 数据结构
阅读时长 ≈
数据结构和算法,这是第一篇。

线性表是元素之间的线性关系,也就是“一个接一个”。
有两种实现,一种是顺序表,一种是链表。

–顺序表

顺序表是用一块连续的内存空间存放数据,所以好处就是定位某个位置的元素是比较容易,
但插入删除时需要移动元素,导致效率低。

一般顺序表的数据结构定义如下:

1
2
3
4
typedef struct {
T data[maxsize];
int last;
}

我实现了一个完整的顺序表的类,点这里查看
包括了一些基本的操作,如插入元素,定位元素,删除元素等。

–链表

链表是用指针实现的,不需要连续的内存空间,所以插入删除速度很快。
但相应的,由于地址不连续,定位某个位置的元素会比较慢。

链表的数据结构一般包含两个部分,数据域和指针域。如下:

1
2
3
4
typedef struct Node{
T data;
struct Node *next;
}

同样我也实现了一个完整的链表类,点这里查看
实现了增删改查。

ubuntu使用习惯

发表于 2018-05-26 | 分类于 linux , ubuntu
阅读时长 ≈

作为一名程序员电脑上装个双系统是很正常的事情,装完双系统当然要改造一下适应自己的习惯.

更改时间

一般ubuntu和win10双系统会差八个小时,因为win10会把硬件时间当作本地时间,而Linux会将硬件时间当作utc时间。

ubuntu下解决:

1
sudo timedatectl set-local-rtc 1

win10下解决:

1
注册表找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation

在TimeZoneInformation里新建Dword类型键RealTimeIsUniversal值为1,保存重启。

更换阿里源

用官方的软件源和用阿里的速度根本就不是一个级别的。

在https://opsx.alibaba.com/mirror 找到ubuntu对应的内容,复制。

替换掉/etc/apt/sources.list中的内容。

替换之前记得备份。

更改git的默认编辑器为vim

1.全局修改,git config --global core.editor vim

2.打开.git/config,在core中添加editor=vim

安装mysql

1
2
3
sudo apt-get install mysql-server
sudo apt install mysql-client
sudo apt install libmysqlclient-dev

将mysql设置为utf编码

修改/etc/mysql/my.cnf
1
2
3
4
5
6
7
8
[client]
default-character-set=utf8

[mysqld]
character-set-server=utf8

[mysql]
default-character-set=utf8




nothing

发表于 2018-05-26 | 分类于 杂谈
阅读时长 ≈


有人作恶,就有人为善

就像bug和debug

你们Debug the world

我来debug my code



——致差评




Hello World

发表于 2018-05-25
阅读时长 ≈

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment

letangers

letangers

8 日志
7 分类
7 标签
GitHub E-Mail
© 2018 letangers
本站访客数: