1.TCP/UDP在传输层;IP在⽹络层;MAC在数据链路层
2.NAT的实现⽅式有三种,即静态转换、动态转换和端⼝多路复⽤3.端⼝号是16位的,范围在0~65535
4.在套接字通信中,常⽤套接字类型包括三类:流式套接字、数据报套接字和原始套接字
①流式套接字(其类型字段的值是SOCK_STREAM): 提供⾯向连接的、可靠的字节流服务,应⽤程序所访问的传输层协议是TCP协议。
②数据报式套接字(其类型字段的值是SOCK_DGRAM): 提供⽆连接的,不可靠的数据报服务,应⽤程序所访问的传输层协议是UDP协议。
③原始套接字(其类型字段的值是SOCK_RAW): 允许应⽤程序直接对较低层的协议,如IP、ICMP进⾏访问。5.有状态服务器
定义:保存状态信息的服务器
优势:减少客户和服务器交换报⽂的⼤⼩;允许服务器快速相应请求⽆状态服务器
定义:不保存任何状态信息的服务器优势:提⾼协议的可靠性6.并发服务器
定义:在⼀个时刻只处理⼀个请求的服务器循环服务器定义:在⼀个时刻可以处理多个请求的服务器7.⾯向应⽤的⽹络编程⽅法(1)WinInet编程
(2)基于WWW应⽤的⽹络编程(3)⾯向SOA的Web Service8.⾯向原始帧的⽹络编程⽅法(1)直接⽹卡编程技术
(2)基于Packet Driver的⽹络编程⽅法(3)基于NDIS的⽹络编程(4)WinPcap编程
9.UDP是⽆连接的;TCP是⾯向连接的意义:
①决定了客户和服务器交互所采⽤的算法;②决定了下层系统所提供的可靠性等级;⾯向连接的服务器优点:易于编程缺点:资源消耗问题
⽆连接的服务器优点:⽆资源消耗问题缺点:编程复杂
10.bind和listen函数是⾮阻塞的11.B/S模型
B/S(Browse/Server)模型也叫B/S模式,它是⼀种基于Web的通信模型,使⽤HTTP通信。B/S是⼀种特殊的C/S模型,特殊之处就在于这种模型的客户端⼀般是某种流⾏的浏览器,例如,微软的Internet Explorer。
优点:单台计算机可以访问任何⼀个Web服务器,不需要针对不同的服务器分别提供专⽤的客户端软件。12.客户/服务器模型优点:(1)结构简单(2)⽀持分布式、并发环境
(3)服务器集中管理资源,有利于权限控制和系统安全(4)可扩展性好
缺点:(1)缺乏有效的安全性(2)客户负荷过重(3)服务器⼯作效率低(4)容易造成⽹络阻塞13.浏览器/服务器模型
优点:(1)具有分布性特点,可以随时随地进⾏查询、浏览等业务处理(2)业务扩展简单⽅便,通过增加⽹页即可增加服务器功能
(3)维护简单⽅便(4)开发简单,共享性强
缺点:(1)操作时以⿏标为最基本的操作⽅式,⽆法满⾜快速操作的要求(2)页⾯动态刷新,响应速度明显降低(3)功能弱化,难以实现传统模式下的特殊功能要求14.字节顺序:⼤端顺序和⼩端顺序15.Linux中提供的基本I/O功能
16.会聚点问题的解决⽅案
1)要求下层通信协议在请求报⽂到达后⾃动创建运⾏程序
——底层通讯程序太复杂!2)要求在任何⼀对进⾏通信的应⽤进程中,有⼀⽅必须在启动执⾏后(⽆限期)等待对⽅与其联系。
——客户-服务器模型的解决⽅案17.客户端通信过程:①socket初始化;
②创建套接字,指定使⽤TCP(可靠的传输服务)进⾏通信;③指定服务器地址和通信端⼝;④向服务器发送连接请求;⑤进⾏数据传输;⑥关闭套接字;
⑦结束对windows sockets dll的使⽤。18.服务器通信过程:①socket初始化;
②创建套接字,指定使⽤TCP(可靠的传输服务)进⾏通信;③指定本地地址和通信端⼝;④等待客户端的连接请求;⑤进⾏数据传输;⑥关闭套接字;
⑦结束对windows sockets dll的使⽤。
19.接收函数的调⽤结果有很多种
完整接收流数据int iResult, recvbuflen;char recvbuf [MSGSZ];do {
iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);if ( iResult > 0 )
printf(\"Bytes received: %d\\n\else {
if ( iResult == 0 )
printf(\"Connection closed\\n\");
else
printf(\"recv failed with error: %d\\n\}
} while( iResult > 0 );20.接收定长数据
int recvn(SOCKET s, char * recvbuf, unsigned int fixedlen){
int iResult; //存储单次recv操作的返回值
int cnt; //⽤于统计相对于固定长度,剩余多少字节尚未接收cnt = fixedlen;while ( cnt > 0 ) {
iResult = recv(s, recvbuf, cnt, 0);if ( iResult < 0 ){
//数据接收出现错误,返回失败
printf(\"接收发⽣错误: %d\\n\return -1;}
if ( iResult == 0 ){
//对⽅关闭连接,返回已接收到的⼩于fixedlen的字节数printf(\"连接关闭\\n\");return fixedlen - cnt;}
//printf(\"接收到的字节数: %d\\n\//接收缓存指针向后移动recvbuf +=iResult;//更新cnt值cnt -=iResult;}
return fixedlen;}
21.接收变长数据
int recvvl(SOCKET s, char * recvbuf, unsigned int recvbuflen){
int iResult;//存储单次recv操作的返回值
unsigned int reclen; //⽤于存储报⽂头部存储的长度信息//获取接收报⽂长度信息
iResult = recvn(s, ( char * )&reclen, sizeof( unsigned int ));if ( iResult !=sizeof ( unsigned int ){
//如果长度字段在接收时没有返回⼀个整型数据就返回(连接关闭)或-1(发⽣错误)if ( iResult == -1 ){
printf(\"接收发⽣错误: %d\\n\return -1;}else{
printf(\"连接关闭\\n\");return 0;}}
//转换⽹络字节顺序到主机字节顺序reclen = ntohl( reclen );if ( reclen > recvbuflen ){
//如果recvbuf没有⾜够的空间存储变长消息,则接收该消息并丢弃,返回错误while ( reclen > 0){
iResult = recvn( s, recvbuf, recvbuflen );if ( iResult != recvbuflen ){
//如果变长消息在接收时没有返回⾜够的数据就返回(连接关闭)或-1(发⽣错误)if ( iResult == -1 ){
printf(\"收发⽣错误:%d\\n\return -1;}else {
printf(\"连接关闭\\n\");return 0;}
}
reclen -= recvbuflen;//处理最后⼀段数据长度if ( reclen < recvbuflen )recvbuflen = reclen;}
printf(\"可变长度的消息超出预分配的接收缓存\\r\\n\");return -1;}
//接收可变长消息
iResult = recvn( s, recvbuf, reclen );if ( iResult != reclen ){
//如果消息在接收时没有返回⾜够的数据就返回(连接关闭)或-1(发⽣错误)if ( iResult == -1 ) {
printf(\"接收发⽣错误: %d\\n\return -1;}else {
printf(\"连接关闭\\n\");return 0;}}
return iResult;}简答题
2、阐述程序、套接字、端⼝和协议之间的关系
程序和套接字的关系:⼀个程序可以同时使⽤多个套接字,不同套接字完成不同的传输任务。多个应⽤程序可以同时使⽤同⼀
个套接字,不过这种情况并不常见。
套接字和端⼝的关系:每个套接字都有⼀个关联的本地TCP或UDP端⼝,它⽤于把传⼊的分组指引到应该接收它们的应⽤程序。⼀个端⼝上可能关联多个套接字,流式套接字的服务器上可能同时有监听套接字和连接套接字,它们都与⼀个TCP的端⼝号相关联;⼀个套接字⼀般只会关联⼀个唯⼀的本地端⼝号。端⼝和协议的关系:TCP和UDP的端⼝号是独⽴使⽤的。
3、在基于流式套接字的⽹络应⽤程序设计中,假设客户端以8字节-12字节-8字节-12字节的顺序交替发送数据给服务器,请思考,服务器的接收操作每次能够接收到多少字节的数据?为什么?
服务器接收操作每次能够接收到的数据长度是不确定的,这是因为TCP传送数据的形态是没有间隔的字节流,数据接收仅与接收调⽤的时间和当前主机内核缓存中尚未提交应⽤程序的数据有关,与发送端发送多少次和TCP 如何传送没有直接的关系,我们不能准确地预测⼀个特定的接收操作到底返回多少字节。
4.在服务器和客户的通信过程中,服务器是如何处理多个客户服务请求的呢?
1)如果是循环服务器,则服务器在与⼀个客户建⽴连接后,其他客户只能等待;当⼀个客户服务完之后,服务器才会接收另⼀个客户的服务请求;即循环服务器的通信流程中,蓝⾊的3个步骤是循环进⾏的;
2)如果是并发服务器,则当服务器与⼀个客户进⾏通信的过程中,可以同时接收其他客户的服务请求,并且服务器要为每⼀个客户创建⼀个从进程,在从进程中⽤新创建的套接字与客户交互;即并发服务器的通信流程中蓝⾊的3个步骤,在与多个客户通信时,是并发执⾏的;
5.为什么客户端没有bind,⽽服务器端需要?
客户端是主动连接,⽽服务器是等待连接,因此服务器必须需要绑定IP地址和端⼝号,⽽客户端不需要。6.客户端的套接字如何获得端点地址?
通过getsockname()函数能够获得套接字关联的本地端点地址通过getpeername()函数能够获得套接字关联的远端端点地址7.应⽤如何获知⾃⼰当前的主机地址和端⼝号?通过getaddrinfo()函数获知
因篇幅问题不能全部显示,请点此查看更多更全内容