检验和:
发送端:
- 先设置检验和字段为 0
- 每两个字节为一组,进位累加求和,多出的加到最后一位
- 把求和结果求反,求反即转换成 2 进制后,0 变 1,1 变 0
- 把计算结果放入检验和字段
接收端
- 把每 2 个字节为一组,进位累加求和
- 把求和结果求反:为 0 即未检验出差错(不排除没检测出来的错误)
4.TCP 的首部格式(端口号,序号,确认号,窗口,首部长度,检验和,6 个标志位)
端口号:各占 2 个字节
当访问百度时,源端口使用客户端系统随机分配的端口号,目的端口是使用熟知端口号 80
序号:占 4 个字节。序号范围是【0~2^32-1】,循环使用
确认号:占 4 个字节,是期望收到对方下一个报文段的第一个数据字节的序号。若确认号为 N,则代表:序号 N-1 为止的所有数据都已正确收到
窗口:占 2 个字节。窗口值是【0~2^16-1】之间的整数。窗口指的是发送本报文段的一方的接收窗口。窗口值告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量。窗口值作为接收方让发送方设置其发送窗口的依据。
窗口字段明确指出了现在允许对方发送的数据量。窗口值经常在动态变化着
首部长度:占 4 位,也叫数据偏移,最小 20,最大 60
检验和:占 2 位,检验和字段检验的范围包括首部和数据两部分
6 个标志位:
- 紧急 URG:当 URG=1 时,表明紧急指针字段有效。紧急指针:指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)
- 确认 ACK:只有当 ACK=1 时确认号字段才有效
- 推送 PSH:接收方 TCP 收到 PSH=1 的报文段,就尽快地交付接收应用进程,而不再等到整个缓存都填满了后再向上交付
- 复位 RST:当 RST=1 时,表明 TCP 连接中出现严重差错,重新建立运输连接
- 同步 SYN:同步 SYN=1 表示这是一个连接请求或连接接受报文
- 终止 FIN:FIN=1 表明发送端的数据已发送完毕,并要求释放运输连接
5.TCP 的可靠传输:超时重传机制,TCP 流量控制(序号,确认号,确认标志位,窗口,死锁问题与持续计时器),发送缓存和接受缓存的作用,捎带确认与累积确认
超时重传机制:
超时计时器时间 RTO:RTO=RTTs 4*RTTD
测量多个 sampleRTT 求平均值,形成 RTT 的估计值 RTTs:
RTTs=(1-α) * RTTS α * SampleRTT 典型值α=1/8
测量 RTT 的变化值:RTTs 与 SampleRTT 的差值:
RTTd=(1-β) * RTTD β * |RTTs-SampleRTT| 典型值:β=1/4
TCP 流量控制(序号,确认号,确认标志位,窗口,死锁问题与持续计时器) :
- 序号:发送窗口里面的序号表示允许发送的序号
- 确认号:表明主机期望收到的下一个序号,而上一个序号位置的数据已经收到了
- 确认标志位:
- 窗口:窗口指的是发送本报文段的一方的接收窗口;发送窗口表示:在没有收到 B 的确认的情况下,A 可以连续把窗口内的数据都发送出去。
- 死锁问题:发送方等待接收方通知窗口大小,接收方等待发送方发送数据
- 持续计时器:当发送方收到接收方的零窗口通知,启动持续计时器。若持续计时器到期,就发送一个零窗口探测报文段
- 接收方发送的确认报文段中:
若窗口仍是零,则重置持续计时器
若窗口不是零,则死锁打开
发送缓存和接受缓存的作用: - 发送方应用进程把数据发送到 TCP 的发送缓存;发送缓存暂时存放:1 准备发送的数据;2 已发送未确定的数据
- 接收方应用进程从 TCP 的接收缓存中读取字节流;接收缓存暂时存放:1 已收到但尚未提交的数据;2 失序的数据
捎带确认与累积确认: - 累积确认:即不必对收到的分组逐个发送确认,而是对按序到达的最后一个分组发送确认,这样就表示:到这个分组位置的所有分组都已正确收到了
- 捎带确认:当一个数据帧到达的时候后,接收方并不是立即发送一个单独的控制帧,而是抑制一下自己并且开始等待,知道网络层传递给他下一个分组,然后,确认信息被附在往外发送的数据帧中(使用帧头中的 ack 域)。实际上,确认报文搭了下一个外发数据帧的便车。
6.TCP 的拥塞控制:网络拥塞的判断,传输轮次与拥塞窗口大小的关系(慢开始与拥塞避免,门限 ssthresh,重传计时器超时与三个重复 ACK)
网络拥塞的判断:重传定时器超时
*** 传输轮次与拥塞窗口大小的关系(慢开始与拥塞避免,门限 ssthresh,重传计时器超时与三个重复 ACK)***:
- 慢开始:每经过一个 RTT,cwnd 翻倍
- 拥塞避免:每经过一个 RTT,cwnd 加一
- 慢开始门限 ssthresh:当 cwnd = ssthresh 时由指数增长切换为线性增长;ssthresh=24 时,重传计时器超时,发送方判断为网络拥塞。调整 ssthresh=cwnd/2,拥塞窗口 cwnd=1,执行慢开始
7.TCP 连接:TCP 的套接字,三次握手建立 TCP 连接,四次握手释放 TCP 连接
TCP 的套接字:就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制
三次握手建立 TCP 连接:
- 刚开始客户端 A 和服务端 B 都是关闭的
- B 的 TCP 服务器进程被动打开,准备接受客户进程的连接请求
- A 主动打开,A 向 B 发出 SYN 报文段,选择初始序号,不携带数据。SYN=1,SEQ=X
- B 收到 SYN 报文段,发回 ACK 报文段,选择初始序号,分配缓存,不携带数据。SYN=1.ACK=1.SEQ=Y,ack=x 1
- A 向 B 发送 SYN ACK 报文段,可携带数据。通知上层应用进程:TCP 连接已建立。
- B 通知其上层应用进程 TCP 连接已经建立。