1. 传输层中的一些基本概念
- TCP 和 UDP 的一些区别
- UDP 的数据格式,伪首部是固定的 12bytes,源 IP 为 0 17,也是固定表示 UDP 的。伪首部仅仅是用来计算校验和,不会传给网络层。
- 源端口/目标端口:就是平时用到的 port。源端口是临时开启的随机端口,目标端口有一些常用端口号如下图
- UDP 首部就 8bytes
2. TCP 的数据格式
- 数据偏移*4=数据长度,整个 TCP 长度 = 20byte 首部+数据长度。
- 传输层的数据长度 = 网络层的总长度 – 网络层的首部长度 – 传输层的首部长度。
- TCP 的[SYN]标志位:SYN=1,ACK=0 表示一个建立连接的请求;对方如果回复 SYN=1,ACK=1,则表示同意建立连接。
3. TCP的自动重传ARQ,连续ARQ,滑动窗口协议
- 停止等待 ARQ 协议:TCP 的自动重传请求,如下:
- 比 ARQ 效率高的连续 ARQ 和滑动窗口协议
- SACK(选择性确认):不同于上述的连续 ARQ,它的先进在于如果一旦发现数据丢失,不会把整个分组重传,它可以查得到是该分组内第几个包丢了,并重发当前包,最多携带 4 组。
4. 从wireshark来看TCP的分段传输
- 从一段抓包来研究 TCP,在下面包里,从第 5 行开始看:首先从5-9 行,服务器一口气发了 5 个数据包过来,第 10 行客户端才开始确认,确认完毕后服务器从第 11 行又开始往下发数据。
Seq是序号,表示发送的数据包第一个字节的编号。Ack 是确认,表示确认收到了多少个字节,接下来从多少字节开始发。
第 5-9 行都是服务器发送的数据,Seq 从 1 一直增加到了 4153,len 第一是 312,后面是 1280。但是 Ack 一直是 748 没有变。第 10 行客户端的回复中看出来。客户端的 Req 是 748,Ack 是 5433,表示客户端一口气收到了 5 个服务器发来的数据,并希望服务器继续从 5433bytes 开始发。所以第 11 行,服务器继续从 5433 开始开始发送数据。这里的 Seq 一直是相对 Seq,在传输过程中,原始Seq(raw Seq)是累加的,会特别大。Win
表示窗口,这个字段有流量控制的功能,用来告知对方下一次允许发送的数据大小,避免流量堵塞,发送方的窗口大小不能比接收方的窗口大。
- 我们数据选择在传输层就分段传输,而没有在网络层切片的原因?因为数据链路和网络层都没有重传功能,没有可靠传输的功能,但是传输层有
ARQ/SACK
。
5. TCP的建立连接过程
- 流量控制:Win 表示窗口,这个字段有流量控制的功能,用来告知对方下一次允许发送的数据大小,避免流量堵塞,发送方的窗口大小不能比接收方的窗口大。rwnd 表示接收窗口,swnd 表示发送窗口,cwnd 表示拥塞窗口。
- MSS(Max Segment Size):每个段最大的数据部分大小,只会在建立连接的时候出现。在建立连接的时候协商好(下图可以看客户端给服务器 1460,服务器回客户端 1412。最终以较小的部分为准),如下图,在 TCP 的三次握手报文中,MSS=1460。SYN=1,ACK=0 表示一个建立连接的请求;对方如果回复 SYN=1,ACK=1,则表示同意建立连接。
6. Seq 和 Ack 之间的交互
6. 从wireshark看TCP释放连接的过程
- 抓包解释释放连接过程:第一次挥手时,主机 1 主动发送出 FIN 报文段,表示主机 1 告诉主机 2,主机 1 已经没有数据要发送了,但是此时主机 1 还可以接受来自主机 2 的数据。第二次挥手时,当主机 2 返回 ACK 报文段时,表示主机 2 已经知道主机 1 没有数据发送了,但是主机 2 还是可以发送数据到主机 1 的。第三次挥手时,当主机 2 也发送了一个 FIN 报文段时,表示主机 2 告诉主机 1,主机 2 已经没有数据要发送了。第四次挥手时,当主机 1 返回 ACK 报文段时,表示主机 1 已经知道主机 2 没有数据发送了,随后整个 TCP 连接正式断开。
- 释放连接的 4 次挥手过程:
- 如果有时抓包只看到 3 次挥手,那是因为第 2,3 次挥手合并了。