tcp总结
cs144 lab1~4实现了一个用户层tcp。现在结合课本做一个总结。
首先贴一个tcp segment的结构图:

first line是两个端口号。
second line为本报文的sequence number,是一个0~2^32-1的int数据。SYN初始化标记位和FIN结束标记位各占一个seqno。seqno到达2^32-1后继续从0开始:tcp连接在内核中存储了真正的报文序列号绝对值,0~2^64-1。
下一行acknowledge number确认号。确认号是对对方发过来的数据的第一个字节,在本地接收端字节流中序号的期望。跟seqno结构类似,不多赘述。
再下一行,标志位+本地接收端窗口大小。初始化三握手报文中,前两次需要SYN标记;从第二次开始往后的报文都需要ACK标记,才算做有效;四挥手结束报文中,主动挥手的一方需要FIN标记。
最后一行payload为报文主体。和SYN||FIN共同组成报文长度。
————————————————
对于每个“有效的”报文,都需要至少进行一次回复表示确认收到报文。
有效的报文:ACK=true,提供有效的数据(让本地receiver端更新ackno)|| 提供新的确认(让本地sender端更新发送队列以及已发出segments的缓存)。
有一种例外:ACK=true,后两个条件都不满足,但(seg.seqno == receiver.ackno-1 && seg.len == 0),这种属于keep alive + winsize报文,同样要回复。
每次回复都要填满对端窗口。
——————————————
最后贴一张八股文吧。
