计算机网络读书笔记:tcp面试常见问题都在里面了
1. 套接字(socket)是同一台主机内应用层与运输层之间的接口。
2. 分层协议的优点之一:上层协议栈不用关心下层协议提供的服务保证,例如http协议不用关心报文是否能完整有序地到达另一个客户端,这将由TCP协议保证。
3. http协议首部行中的host字段是web代理高速缓存所要求的。
4. DNS使用UDP协议。
5. dns服务器类型:根dns服务器,顶级域dns服务器,权威dns服务器。
6. dns缓存。
7. 网络层提供了主机之间的逻辑通信,运输层为存在于不同主机之间的进程提供逻辑通信。
8. udp:不可靠,无连接。tcp:面向连接,可靠传输,拥塞控制。
9. ip协议的服务模型是尽力而为交付服务,为不可靠服务:不保证报文段的交付、不保证交付顺序、不保证报文段中数据的完整性。
10. udp套接字是由一个二元组来全面标识的,该二元组包含一个目的ip地址和一个目的端口号。即源ip或者端口号不同的udp报文发送到相同ip和端口的时候,将使用同一个udp套接字发送。
11. tcp套接字由一个四元组来标识:源ip,源端口号,目的ip,目的端口号。
12. udp优点:无需建立连接,报文更小,不需要确认。
13. tcp报文头部的32位序号字段和确认号字段用于实现可靠数据传输;16位的接收窗口(rwnd)字段用于流量控制,表示接收方愿意接受的字节数量,该字段表示接收方的接收缓存还可以接收多少数据,注意流量控制与拥塞控制不同。
14. 序号是报文段首字节的字节流编号,0、2000、5000。。。,初始序号可以是随机的;确认号是主机A期望从主机B中收到的下一字节的序号。
15. 为什么需要需要三次握手而不是两次握手?两种解释:
(1) 如果只是两次握手,至多只有连接发起方的起始序列号能被确认, 另一方选择的序列号的初始序列号则得不到确认,不知道下一步需要发送哪一个序列号开始的报文。
(2) 服务方 client 发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达 server。本来这是一个早已失效的报文段。但 server 收到此失效的连接请求报文段后,就误认为是 client 再次发出的一个新的连接请求。于是就向 client 发出确认报文段,同意建立连接。假设不采用 “三次握手”,那么只要 server 发出确认,新的连接就建立了。由于现在 client 并没有发出建立连接的请求,因此不会理睬 server 的确认,也不会向 server 发送数据。但 server 却以为新的运输连接已经建立,并一直等待 client 发来数据。这样,server 的很多资源就白白浪费掉了。采用 “三次握手” 的办法可以防止上述现象发生。
16. 三次握手:
(1) 客户端发送一个syn报文,syn位被置1,生成初始序号;
(2) 服务端接收到syn报文,为tcp连接分配缓存和变量,并发送synack报文,syn位被置1,ACK置1,生成初始序号,确认号字段被设置为客户端初始序号+1;
(3) 客户端接收到synack报文,为tcp连接分配缓存和变量,sync被设置为0,ACK置1,确认号被设置为服务端初始序号+1;
简单来说就是 :
(1) 客户端向服务端发送SYN
(2) 服务端返回SYN,ACK
(3) 客户端发送ACK
17. 四次挥手:
(1) 客户端发送一个fin置位的特殊报文段;
(2) 服务器发送一个ack置位的确认报文段;
(3) 服务器发送一个fin置位的特殊报文段;
(4) 客户端发送一个ack置位的确认报文段;
1.18
19. tcp拥塞控制:慢启动、拥塞避免、快速恢复
(1) 慢启动阶段,发送窗口(cwnd)在每一个往返时间(RTT)内翻倍。
① 遇到超时,将发送窗口值设置为1(MSS,最大报文段长度,Maximum Segment Size),ssthresh(慢启动阈值)设置为cwnd的一半,重新开始慢启动。
② 当cwnd值等于ssthresh时,进入拥塞避免模式。
③ 检测到3个冗余ack,执行快速重传并进入快速恢复状态。
(2) 拥塞避免阶段,cwnd在每一个RTT内加1
① 遇到超时,cwnd的值被设置为1,ssthresh(慢启动阈值)设置为cwnd的一半,重新开始慢启动。
② 检测到3个冗余ack,ssthresh设置为cwnd的一半,cwnd减半,并进入快速恢复
(3) 快速恢复阶段
① 对于由于冗余ack进入的快速恢复,降低cwnd值之后进入拥塞避免
② 超时发生,cwnd值设置为1,ssthresh设置为cwnd的一般半,进入慢启动。
20. 回退N步(GBN,又被称为滑动窗口协议),基序号(base)被定义为最小的未被确认的序号,下一个序号(nextseqnum)被定义为最小的未被使用的序号,N为滑动窗口的大小,限制为N是为了流量控制。注意,滑动窗口存在于发送方。
21. gbn协议,接收方如果接收到失序的报文,则丢失;如果发送方收到了base序号的超时事件,则重传base及之后已经被发送过的报文段,这即是回退N步的含义。
22. gbn采用累积确认的方式,即对序号为n的确认表示序号n及之前的报文都已经被正确接收,其使用单个计时器;sr采用分组确认,每个分组有一个定时器。
23. sr协议(选择重传)在发送方和接收方都有一个滑动窗口,接收方和发送方的窗口并不总是一致。窗口长度必须小于等于序号空间的一半。
24. sr协议其不采用累积确认,每一个分组都拥有一个定时器,对接收到的失序分组采用缓存的策略。
25. Tcp使用单一定时器,可以认为与最早的未被确认的报文段相关联,当出现超时时,定时器超时事件将翻倍,且当需要重新发送数据或者收到ack时,定时器复原,这也是一种形式的拥塞控制。
26. tcp使用累积确认,这于gbn类似,但同时会缓存失序的报文,其不会回退N步,而是最多重传一个报文。
参考:
《计算机网络:自顶向下方法》