选择题
1、【百度文库】下面的说法哪一个是错误的( C )
A、在TCP协议中,发送方必须重发久未应答的TCP段
B、TCP协议的接收方必须将剩余缓冲区的大小置入Windows size(接收窗口)来通知发送方
C、在任何情况下,TCP实体总是立即发送应用程序的输出数据
D、TCP的发送方除了需要一个发送窗口外,还需要一个阻塞窗口。
解析
就如第一次发送前,TCP需要经过三次握手初始化后,才开始发送信息。
2、【百度文库】下面哪一个的说法是正确的 ( B )
A、由于TCP是可靠的数据传输协议,而UDP是不可靠的数据传输协议,所以TCP总是优于UDP
B、点对点不需要ARP协议,以太网需要ARP协议
C、IP实体不仅要接收和发送IP数据报,还需要维护路由表
D、在任何情况下,TCP实体总是立即发送应用程序的输出数据
解析
在以太网协议中规定,同一局域网中的一台主机要和另一台主机进行直接通信,必须要知道目标主机的MAC地址。
而在TCP/IP协议栈中,网络层和传输层只关心目标主机的IP地址。这就导致在以太网中使用IP协议时,数据链路层的以太网协议接到上层IP协议提供的数据中,只包含目的主机的IP地址。
于是需要一种方法,根据目的主机的IP地址,获得其MAC地址。这就是ARP协议要做的事情。
3、【百度文库】在实现基于TCP的网络应用程序时,服务器端正确的处理流程是( C )
A、socket() -> bind() -> listen() -> connect() -> read()/write() -> close()
B、socket() -> bind() -> listen() -> read()/write() -> close()
C、socket() -> bind() -> listen() -> accept() -> read()/write() -> close()
D、socket() -> connect() -> read()/write() -> close()
解析:具体过程应用题中有
4、在TCP连接建立过程中,首先由请求建立连接的一方(客户端)发送一个TCP段,该TCP段应将( C )
A、FIN置1
B、FIN置0
C、SYN置1
D、SYN置0
解析:
TCP/IP协议中的三次握手,TCP协议通过三次握手建立一个可靠的连接。
第一次握手:客户端尝试连接服务器,向服务器发送syn包,syn=j,客户端进入SYN_SEND状态等待服务器确认
第二次握手:服务器接收客户端syn包并确认(ack=j+1),同时向客户端发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态
第三次握手:第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手
注:服务器socket与客户端socket建立连接的部分就是三次握手
应用题
简述UDP编程和TCP编程的区别:
解析:
udp通信过程不需要建立连接,也不需要三次握手。UDP客户端直接向服务器端发送信息,服务器循环读取相应地址的数据信息。
UDP的recvfrom()和sendto()的参数中包含了通信的地址信息,在传输数据的同时,能够找寻通信目标地址。
注:
TCP编程的服务器端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt(); * 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();
4、开启监听,用函数listen();
5、接收客户端上来的连接,用函数accept();
6、收发数据,用函数send()和recv(),或者read()和write();
7、关闭网络连接;
8、关闭监听;
TCP编程的客户端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
4、设置要连接的对方的IP地址和端口等属性;
5、连接服务器,用函数connect();
6、收发数据,用函数send()和recv(),或者read()和write();
7、关闭网络连接;
与之对应的UDP编程步骤要简单许多,分别如下:
UDP编程的服务器端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();
4、循环接收数据,用函数recvfrom();
5、关闭网络连接;
UDP编程的客户端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
4、设置对方的IP地址和端口等属性;
5、发送数据,用函数sendto();
6、关闭网络连接;
简述TCP协议的socket交互流程:
解析:
如图即socket客户端和服务端建立连接的过程
具体过程:
1、服务器根据地址类型(ipv4,ipv6)、socket类型和协议创建socket
2、服务器为socket绑定ip地址和端口号
3、服务器socket监听端口号的请求,随时准备接收客户端发来的连接,这时服务器的socket并没有打开
4、客户端创建socket
5、客户端打开socket,根据服务器ip地址和端口号试图连接服务器socket
6、服务器socket接收到客户端socket请求,被动打开,开始接收客户端请求,直到客户端返回连接信息。这时候socket进入阻塞状态,所谓阻塞状态即accept()方法一直到客户端返回连接信息后才返回,开始接受下一个客户端连接请求
7、客户端连接成功,向服务器发送连接状态信息
8、服务器accept方法返回,连接成功
9、客户端向socket写入信息
10、服务器读取信息
11、客户端关闭
12、服务器端关闭
(408,2016)假设上图中的H3访问Web服务器S时,S为新建的TCP连接分配了20 KB(K=1 024)的接收缓存,最大段长MSS=1 KB,平均往返时间RTT=200 ms。
H3建立连接时的初始序号为100,且持续以MSS大小的段向S发送数据,拥塞窗口初始阈值为32 KB;S对收到的每个段进行确认,并通告新的接收窗口。假定TCP连接建立完成后,S端的TCP接收缓存仅有数据存入而无数据取出。
请回答下列问题:
H3收到的第8个确认段所通告的接收窗口是多少?此时H3的拥塞窗口变为多少?H3的发送窗口变为多少?(该问不需要图片)
解析:
这个题来自于曾经的一个408真题,我记得曾经就是靠这个题弄懂了TCP的拥塞控制
在普通的拥塞控制算法中,比如像这个题中的MSS = 1KB,在慢开始阶段增长规律是1→2→4→8.....
这个也是在408辅导书中介绍的规律,指数级增长,而且这个正常规律使用非常方便,于是就自然而然的忽略了每个RTT拥塞窗口的细节变化
就拿上面说的 4→8 而言,其实是这样的,假如当前的发送窗口是4,那么全部发出再全部确认,那么一个RTT之后,发送窗口大小就是8。
具体过程:
1、第一段确认回来,发送窗口 4 + 1 = 5
2、第二段确认回来,发送窗口 5 + 1 = 6
3、第三段确认回来,发送窗口 6 + 1 = 7
4、第四段确认回来,发送窗口 7+ 1 = 8
也就是说,1RTT发送了4个MSS,而发送窗口每收到一个确认,窗口大小就增加一个MSS。宏观上看好像是一个RTT增加了4个MSS,但实际上还是一个MSS一个MSS增长的。
接下来开始解析题目:
初始发送1KB,接收缓存后,确认帧告知:接收窗口 = 20 - 1 = 19
第一个RTT发送2KB,收到后确认帧告知:接收窗口 = 19 - 2 = 17
第二个RTT发送4KB,收到后确认帧告知:接收窗口 = 17 - 4 = 13
此时一共接收到了了1 +2 + 4 = 7个确认段
第三个RTT应该发送8KB,但是,第三个RTT里面的第一个数据段(1KB)发送过去,收到的确认段即题目要求的,因为已经接收了8个确认段,而不是这8KB全部发送的完收到的确认段。
此时接收窗口 = 20 - 8 = 12,H3最初设置了1KB的的拥塞窗口,又接到了8个确认段,因此拥塞窗口 = 1 + 8 = 9KB
因此H3发送窗口 = min(接收窗口,拥塞窗口) = 9KB