一、评价软件工程师的计算机网络知识水平和网络编程水平的标准
1. 知识水平:
- 熟悉OSI七层模型/TCP/IP五层模型,深刻理解各层为网络提供了什么服务
- 熟悉各层的协议,尤其是TCP/UDP、IP、ARP和HTTP这些在工作中常用的协议
- 路由器、集线器、光纤等设备的了解
2. 网络编程水平:
- 熟练运营业务语言(C++/Java/python/go等)的网络编程基础,如套接字编程、阻塞/非阻塞通信、创建HTTP服务器与客户程序、数据报通信、对象的序列化与反序列化、Java反射机制、RMI框架、JavaMail API、MVC设计模式、安全网络通信、CORBA和Web服务 等等。
- 熟练运用业务语言(C++/Java/python/go等)进行网路编程,包括各种工具和网络框架,如Java网络编程框架:Apache MINA、Grizzly、netty等
- 掌握网络系统的性能测试和优化技术
- 熟悉网络glibc库网络编程函数和运用,如基本套接字调用
- 深入了解Linux内核的网络实现,包括协议栈的初始化、socket API是如何实现等
3. 其他水平
- 较强的学习能力。工作进入各大网络服务公司如华为、思科等,如果进行网络设备相关的开发,将会接触到很多没听过的协议栈,所以快速学习、掌握一个新的协议的能力将对软件工程师的业务能力提升有很大帮助。
- 较强的代码能力和debug能力。
- 英语能力。很多协议都是国外的组织提出来的,较好的英语水平有助于阅读协议文档。
二、课程总结
前言:
半个学期的课程,由浅入深,由易入难,通过对Linux的网络协议栈的实现细节的研究,感觉自己对计算机网络的理论有了更深刻的认识。
最深刻的体会还是理论与实际结合的美妙。之前不管是本科还是考研,对计算机网络的了解仅局限于课本的理论,只是为了考试去背各种协议的原理,背数据包的字段含义。理论不与实际结合,考完试就会忘得一干二净。平常用高级语言进行网络编程,只需要调下socket方法,填个url,把包内容以key-value的形式填进去就完事了,久而久之真的都不知道学习计算机网络的意义。脱离底层实现,感觉更不需要学原理了。
此番学习让我改变了对网络的学习态度,并从Linux内核源码的阅读中学到了很多。
技术总结:
Linux socket API:
/*
/**
* 功能:创建socket
* 参数: domain 表示使用何种底层协议族
* type 表示指定服务类型,主要有SOCK_STREAM(TCP流服务)和SOCK_DGRAM(UDP数据报)等服务;
* protocol 表示在前两个参数确定的协议集合下,进一步确认具体传输协议,通常为0
*
*/
int socket(int domain, int type, int protocol);
/**
* 功能:绑定socket
* 参数:
* sockfd 表示需要绑定的目标socket文件描述符;
* my_addr 表示将socket地址绑定至sockfd,即命名该sockfd;
* addrlen 表示该地址的长度。
*/
int bind(int sockfd, const struct sockaddr* my_addr, socklen_t addrlen);
/**
* 功能:在内核创建监听队列
* 参数:
* sockfd 表示创建的socket文件描述符;
* backlog 表示提示内核监听队列中处于完全连接状态(ESTABLISHED)socket的最大长度
*/
int listen(int sockfd, int backlog);
/**
* 功能:从内核的连接队列中获取已经完成三次握手的完成连接,并返回新的连接sockfd。
* 参数:
* sockfd 表示已监听的socket文件描述符;
* addr 表示用来获取远端的socket地址;
* addrlen 表示地址的长度。
*/
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
/**
* 功能:发起连接
* 参数:
* sockfd 表示客户端创建的socket文件描述符;
* serv_addr 表示服务器端socket地址;
* addrlen 表示服务器端socket地址的大小;
*/
int connect(int sockfd, const struct sockaddr * serv_addr, socklen_t addrlen);
/**
* 功能:断开连接
* 参数:
* sockfd 表示客户端创建的socket文件描述符;
*/
int close(int sockfd);
/**
* 功能:数据通信
* 参数:
* flags 参数为数据收发提供了额外的控制:
* MSG_OOB发送和接收紧急保温;
* MSG_NOSIGNAL 往读端关闭的管道或者socket连接中写入数据时,不引发SIGPIPE信号。
*/
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
ssize_t send(int sockfd, const coid *buf, size_t len, int flags);
网络协议栈总结:
三、试卷建议
一、 选择题
-
某主机的 IP 地址为 180.80.77.55,子网掩码为 255.255.252.0。若该主机向其所在子网发送广播分组,则目的地址可以是_____ 。
A.180.80.76.0
B.180.80.76.255
C.180.80.77.255
D.180.80.79.255
(出自2012年408)
答案及解析:D。由子网掩码可知前 22 位为子网号、后 10 位为主机号。IP 地址的第 3 个字节为 01001101(下划线为子网号的一部分),将主机号全置为 1,可得广播地址为 180.80.79.255。 -
主机甲与主机乙之间已建立一个 TCP 连接,主机甲向主机乙发送了两个连续的 TCP段,分别包含 300B 和 500B 的有效载荷,第一个段的序列号为 200,主机乙正确接收到两个段后,发送给主机甲的确认序列号是( ) 。
A.500 B.700 C.800 D.1000
(出自2014年408)
答案与解析:D。TCP 是面向字节流的,其选择确认(Selective ACK)机制是接收端对字节序号进行确认,其返回的序号是接收端下一次期望接收的序号,因此主机乙接收两个段后返回给主机甲的确认序列号是 1000。 -
某自治系统采用RIP协议,若该自治系统内的路由器R1收到其邻居路由器R2的距离矢量中包含信息<net1,16>,则可能得出的结论是( )
A:R2可以经过R1到达net1,跳数为17
B:R2可以到达net1,跳数为16
C:R1可以经过R2到达net1,跳数为17
D:R1不能进过R2到达net1
(出自2010年408)
答案与解析:D。考察RIP协议。R1收到信息并更新路由表后,若需要经过R2到达net1,则跳数变成17,大于16,故不可达,因此B、C都错误,题目没有给出R1向R2发送的信息,因此A也错,故选D -
实现基于TCP的网络应用程序时,服务器端正确的处理流程是( )
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()
答案与解析:C。考察socketAPI的掌握。 -
主机甲向主机乙发送一个(SYN=1,seq=11220)的TCP段,期望与主机乙建立TCP连接,若主机乙接受该连接请求,则主机乙向主机甲发送的正确的TCP段可能是()。
A. (SYN=0,ACK=0,seq=11221,ack=11221)
B. (SYN=1,ACK=1,seq=11220,ack=11220)
C. (SYN=1,ACK=1,seq=11221,ack=11221)
D. (SYN=0,ACK=0,seq=11220,ack=11220)
(出自2011年408)
答案与解析:C。主机乙收到连接请求报文后,如同意连接,则向甲发送确认。在确认报文段中应把SYN位和ACK位都置1,确认号是甲发送的TCP段的初始序号seq=11220加1,即为ack= 11221,同时也要选择并消耗一个初始序号seq,seq值由主机乙的TCP进程确定,本题取seq= 11221与确认号、甲请求报文段的序号没有任何关系。 -
.TCP/IP参考模型的网络层提供的是()。
A. 无连接不可靠的数据报服务
B. 无连接可靠的数据报服务
C. 有连接不可靠的虚电路服务
D. 有连接可靠的虚电路服务
(出自2011年408)
答案与解析:A。TCP/IP的网络层向上只提供简单灵活的、无连接的、尽最大努力交付的数据报服务。此外考察IP首部,如果是面向连接的,则应有用于建立连接的字段,但是没有;如果提供可靠的服务,则至少应有序号和校验和两个字段,但是IP分组头中也没有(IP首部中只是首部校验和)。因此网络层提供的无连接不可靠的数据服务。有连接可靠的服务由传输层的TCP提供 -
ARP协议实现的功能是()。
A.域名地址到IP地址的解析
B.IP地址到域名地址的解析
C.IP地址到物理地址的解析
D.物理地址到IP地址的解析
答案与解析:C。ARP是一个通过解析网络层地址寻找数据链路层地址的网络传输协议,它在IPV4中极其重要。网络层地址就是IP地址,而数据链路层地址就是MAC地址,即所谓的物理地址。
二、综合题
-
ARP是地址解析协议,简单语言解释一下工作原理。
解析:
ARP是解决统一局域网上的主机路由器的IP地址和硬件地址的映射问题。
每一个主机都设有一个ARP高速缓存,里面有本局网上的各主机和路由器的IP地址到硬件地址的映射表。
当主机A要向本局域网上的某个主机B的IP地址发送IP数据报时,就先在其ARP高速缓存中查看有无主机B的IP地址,如果有,就在ARP高速缓存器中查找出其对应的硬件地址,再把这个硬件地址写入mac帧中,然后通过局域网把mac帧发往此硬件地址,否则主机A就自动运行ARP,然后按以下步骤找出主机B的硬件地址:
(1)ARP进程在本局网上广播发发送一个ARP请求分组。
(2)在本局域网上的所有主机上运行的ARP进程都收到此ARP请求分组。
(3)主机B的IP地址与ARP请求分组中要查询的IP地址一致就收下这个ARP请求分组,并向主机A发送ARP响应分组,并在这个ARP响应分组中写如自己的硬件地址。
(4)主机A收到主机B的ARP响应分组后,就在其ARP高速缓存中写入主机B的IP地址到硬件地址的映射。 -
请解释tcp连接建立过程,如果可能,请结合相应系统调用函数解释交互过程。
解析:经过三次握手建立一个连接:
首先A向B发出连接请求报文段,这时首部中的同步位SYN=1,同时选择一个初始序号seq=x。TCP规定,SYN报文段不能携带数据,但要消耗掉一个序号。这时,A进入SYN-SENT状态。
B收到请求后,向A发送确认。在确认报文段中把SYN和ACK位都置为1,确认号是ack=x+1,同时也为自己选择一个初始序号seq=y。请注意,这个报文段也不能携带数据,但同样要消耗掉一个序号。这时B进入SYN-RCVD状态。
A收到B的确认后,还要向B给出确认。确认报文段的ACK置为1,确认号ack=y+1,而自己的序号seq=x+1。这时,TCP连接已经建立,A进入ESTABLISHED状态,当B收到A的确认后,也会进入ESTABLISHED状态。 -
当你在浏览器输入一个网址,如http://www.taobao.com,按回车之后发生了什么?请从技术的角度描述,如浏览器、网络(UDP、TCP、HTTP等),以及服务器等各种参与对象上由此引发的一系列活动,请尽可能的涉及到所有的关键技术点。(来自牛客网——淘宝笔试题)
1、根据域名查询域名的IP。浏览器缓存->操作系统缓存->本地域名服务器缓存->域名服务器。
2、得到IP后发起基于TCP的HTTP请求。如果浏览器存储了该域名下的cookie,那么会把cookie放入HTTP请求头里。
3、TCP被包装为IP包,通过网络(可能经过很多路由器、交换机)发送到IP地址对应的服务器。这个服务器可能只是一个反向***服务器,如果是,则HTTP请求被转交给内网中真实的某一个服务器(可能有多个服务器)。
4、服务器分析HTTP请求,生成HTTP响应(可能是html、图片等)后,将响应发送给客户端浏览器。
5、浏览器得到响应后,根据响应内容显示结果。如果响应的是图片,则将图片”画“在浏览器页面上;如果是HTML,则渲染HTML并”画“在浏览器页面上,在分析HTML时,若发现引用了其他资源,例如css、图片等,则发起HTTP请求,得到响应资源。