Kiprey / Kiprey.github.io

This is Kiprey‘s Blog.
https://kiprey.github.io/
4 stars 3 forks source link

CS144计算机网络 Lab2 | Kiprey's Blog #91

Open Kiprey opened 2 years ago

Kiprey commented 2 years ago

https://kiprey.github.io/2021/11/cs144-lab2/

454270186 commented 1 year ago

请问 uint64_t stream_index = curr_abs_seqno - 1 + (header.syn); 这一步为什么要加 header.syn呀

Kiprey commented 1 year ago

@454270186 请问 uint64_t stream_index = curr_abs_seqno - 1 + (header.syn); 这一步为什么要加 header.syn呀

header.syn 只有 0 和 1 两个值,加上 syn 是因为 SYN 本身也会占据一个 sequence number

454270186 commented 1 year ago

@Kiprey

@454270186 请问 uint64_t stream_index = curr_abs_seqno - 1 + (header.syn); 这一步为什么要加 header.syn呀

header.syn 只有 0 和 1 两个值,加上 syn 是因为 SYN 本身也会占据一个 sequence number

谢谢这么快的答复! 那这么说是每一个tcp segment都会有一个sequence number是用来放syn flag的吗 还是说只有syn为true的segment才有一个sequence number 用来放syn flag 我就是这个地方有点不太理解 特别需要您的帮助,十分感谢!

Kiprey commented 1 year ago

@454270186

@Kiprey

@454270186 请问 uint64_t stream_index = curr_abs_seqno - 1 + (header.syn); 这一步为什么要加 header.syn呀

header.syn 只有 0 和 1 两个值,加上 syn 是因为 SYN 本身也会占据一个 sequence number

谢谢这么快的答复! 那这么说是每一个tcp segment都会有一个sequence number是用来放syn flag的吗 还是说只有syn为true的segment才有一个sequence number 用来放syn flag 我就是这个地方有点不太理解 特别需要您的帮助,十分感谢!

是的,SYN 和 FIN 都会占用一个 seqno,如果某个包没有 SYN 或者 FIN 的话,那就不会额外占用 seqno。

可以参考这个知乎问答:tcp 协议中 为什么syn会消耗一个序号?- 知乎

454270186 commented 1 year ago

@Kiprey

@454270186

@Kiprey

@454270186 请问 uint64_t stream_index = curr_abs_seqno - 1 + (header.syn); 这一步为什么要加 header.syn呀

header.syn 只有 0 和 1 两个值,加上 syn 是因为 SYN 本身也会占据一个 sequence number

谢谢这么快的答复! 那这么说是每一个tcp segment都会有一个sequence number是用来放syn flag的吗 还是说只有syn为true的segment才有一个sequence number 用来放syn flag 我就是这个地方有点不太理解 特别需要您的帮助,十分感谢!

是的,SYN 和 FIN 都会占用一个 seqno,如果某个包没有 SYN 或者 FIN 的话,那就不会额外占用 seqno。

可以参考这个知乎问答:tcp 协议中 为什么syn会消耗一个序号?- 知乎

谢谢! 我再问一个问题,问题有点多实在是打扰了, 那是不是说如果一个segment的syn为true,那它的absolute sequence 就是从0开始的(换句话问 这个包 seg.header().seque 转换成64位后为0)?

Kiprey commented 1 year ago

@454270186

@Kiprey

@454270186

@Kiprey

@454270186 请问 uint64_t stream_index = curr_abs_seqno - 1 + (header.syn); 这一步为什么要加 header.syn呀

header.syn 只有 0 和 1 两个值,加上 syn 是因为 SYN 本身也会占据一个 sequence number

谢谢这么快的答复! 那这么说是每一个tcp segment都会有一个sequence number是用来放syn flag的吗 还是说只有syn为true的segment才有一个sequence number 用来放syn flag 我就是这个地方有点不太理解 特别需要您的帮助,十分感谢!

是的,SYN 和 FIN 都会占用一个 seqno,如果某个包没有 SYN 或者 FIN 的话,那就不会额外占用 seqno。

可以参考这个知乎问答:tcp 协议中 为什么syn会消耗一个序号?- 知乎

谢谢! 我再问一个问题,问题有点多实在是打扰了, 那是不是说如果一个segment的syn为true,那它的absolute sequence 就是从0开始的(换句话问 这个包 seg.header().seque 转换成64位后为0)?

是这样的,例如这个新抓的 TCP 握手片段:

58710 → 80 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 WS=256 SACK_PERM=1 80 → 58710 [SYN, ACK] Seq=0 Ack=1 Win=8192 Len=0 MSS=1200 WS=32 SACK_PERM=1 58710 → 80 [ACK] Seq=1 Ack=1 Win=65792 Len=0

三次握手中没有包含任何明文信息,但是第二次发送 ACK 时其 seq 从 0(第一个SYN)变成了 1。

ausar47 commented 1 year ago

请问对于segment_received里stream_index,不是应该从第一个字节流开始的吗?我知道这里给SYN一个stream_index是为了让它的payload也能被推送到重组器上,但这样一来SYN的stream_index不就和它之后第一个字节的stream_index相等了吗?比如SYN序列号是0,转成stream_index是0,后面一个字节序列号是1,转成stream_index也是0,这样不就会导致后一个字节的内容无法被写到重组器上吗?

ausar47 commented 1 year ago

请问对于segment_received里stream_index,不是应该从第一个字节流开始的吗?我知道这里给SYN一个stream_index是为了让它的payload也能被推送到重组器上,但这样一来SYN的stream_index不就和它之后第一个字节的stream_index相等了吗?比如SYN序列号是0,转成stream_index是0,后面一个字节序列号是1,转成stream_index也是0,这样不就会导致后一个字节的内容无法被写到重组器上吗?

我好像明白了,如果SYN有载荷要写那后面的字节就是被它写掉了,比如这里SYN有一个字节内容那1就是它写掉的,后一个seq则从2开始

Kiprey commented 1 year ago

请问对于segment_received里stream_index,不是应该从第一个字节流开始的吗?我知道这里给SYN一个stream_index是为了让它的payload也能被推送到重组器上,但这样一来SYN的stream_index不就和它之后第一个字节的stream_index相等了吗?比如SYN序列号是0,转成stream_index是0,后面一个字节序列号是1,转成stream_index也是0,这样不就会导致后一个字节的内容无法被写到重组器上吗?

我好像明白了,如果SYN有载荷要写那后面的字节就是被它写掉了,比如这里SYN有一个字节内容那1就是它写掉的,后一个seq则从2开始

可以参考 lab2 pdf 中的这个图来理解: image

Shang-fei commented 6 months ago

请问,SYN 包中的 payload 不能被丢弃这句话怎么理解呢,三次握手中的syn包不是不能携带数据吗?

Kiprey commented 6 months ago

@Shang-fei 请问,SYN 包中的 payload 不能被丢弃这句话怎么理解呢,三次握手中的syn包不是不能携带数据吗?

实际上这个没有明确限制。如果 SYN 包中确实存在 payload,则目前的逻辑可以支持;如果 SYN 包中不存在 payload,则目前的逻辑也可以兼容。

只是我们并不知道对方发送 SYN 包时是否会携带 payload,因此处于兼容的考虑,按照假定携带 payload 的情况来实现。

Shang-fei commented 6 months ago

@Kiprey

@Shang-fei 请问,SYN 包中的 payload 不能被丢弃这句话怎么理解呢,三次握手中的syn包不是不能携带数据吗?

实际上这个没有明确限制。如果 SYN 包中确实存在 payload,则目前的逻辑可以支持;如果 SYN 包中不存在 payload,则目前的逻辑也可以兼容。

只是我们并不知道对方发送 SYN 包时是否会携带 payload,因此处于兼容的考虑,按照假定携带 payload 的情况来实现。

明白了,感谢回答