网络程序设计复习总结
- 格式:doc
- 大小:174.00 KB
- 文档页数:10
读程序15 x2=30分15个空,写注释要详细判断10 x1=10分简答50分7道编程10分头文件,main主函数2分第1章 TCP/IP简介1.网络编程是指编写的网络通信程序可以与网络上的其他程序进行通信.(1)C/S模型:(Client/Server),即客户机和服务器结构。
(2)B/S模型:(Browser/Server),即浏览器和服务器结构。
OSI模型: TCP/IP模型:应用层应用层(协议:Telnet,FTP,SMTP等)表示层会话层传输层传输层(TCP,UDP)网络层网际层(IP)数据链路层网络接口层物理层三次握手.建立TCP连接的步骤:(1)服务器必须已经准备好接收客户的连接请求,这通过调用socket,bind和listen 函数来完成。
客户通过调用connect函数进行主动打开,这引起客户端发送一个SYN分节到服务器端。
(2)服务器收到客户端发来的SYN分节后,必须发送ACK对其进行确认,同时发送一个自己的SYN分节给客户端,表示接受客户端建立连接的请求。
(3)客户端发送ACK确认服务器的SYN,连接建立成功。
2.在释放TCP连接时,执行主动关闭的一端进入TIME_WAIT状态,并且留在该状态的持续时间是报文最长生命周期的两倍,有时称为2MSL(Maximum Segment Lifetime)。
存在这样一个超时时间是因为:(1)实现终止TCP连接的可靠性,如果终止连接的第4个分节ACK丢失了,那么客户端必须重发。
(2)保证原来连接上的重复分节在网络中消失。
3.简)TCP报文中的码元比特6位,:URG和紧急指针配合使用,发送紧急数据;(置1为有效)ACK指出确认字段是否有效;PSH接收方应该尽快将此报文提交给应用层;RST重建连接;SYN同步序号用来请求建立连接;FIN释放连接。
(TCP握手用了4位)4.判)端口号:windows :c:\windows\system32\drivers\etcLinux :etc 下services第2章套接字编程简介1.套接字类型是指创建套接字的应用程序要使用的通信服务的类型。
Linux系统最常用的有3种:(1)SOCK_STREAM:流式套接字,提供面向连接,可靠的数据传输服务,数据按字节流,按顺序收发,保证数据在传输过程中无丢失,无冗余。
(TCP协议支持)(2)SOCK_DGRAM:数据报套接字,提供面向无连接的服务,数据收发无序,不能保证数据的准确到达。
(UDP协议支持)(3)SOCK_RAW:原始套接字。
允许对低于传输层的协议或物理网络直接访问。
常用于检测新的协议。
2.字节存储的顺序分为两类:(1)小端字节序:将低序字节存储在起始地址。
(2)大端字节序:将高序字节存储在起始地址。
例如:0x12345678 小端顺序:78 大端顺序:1256 3434 5612 783.主机字节序和网络字节序之间的相互转换,要用到4个函数:(1)htons:将16位的短整型数从主机字节序转换成网络字节序。
(2)htonl:将32位的长整型数从主机字节序转换成网络字节序。
(3)ntohs:将16位的短整型数从网络字节序转换成主机字节序。
(4)ntohl:将32位的长整型数从网络字节序转换成主机字节序。
h代表主机host, n代表网络network, s代表短整型short, l代表长整型long。
4.Liunx系统提供的字符串IP和二进制值IP相互转换的地址转换函数:int inet_aton(const char * str,struct in_addr *numstr);char *inet_ntoa(struct in_addr inaddr);函数中a代表ASCII串,n代表数值格式,是存在于套接字地址结构中的二进制值。
5.IPv4套接字地址结构名字是sockaddr_in,其中的各个成员变量作用如下(代码略):1)sin_len是长度,存储套接字地址结构的长度;2)sin_family是internet地址族,在IPv4中是AF_INET;3)sin_port是端口号,以网络字节序存储;4)sin_addr是一个结构,该结构里的成员存储IP地址;5)sin_zero成员暂时没有被使用;6)in_addr结构中的s_addr成员存储的网络字节序32位IPv4地址;第3章基本TCP套接字编程1.P22图3-1:TCP套接字编程中,服务器端实现的步骤:(1)使用socket()函数创建套接字;(2)将创建的套接字绑定到指定的地址结构;(3)listen()函数设置套接字为监听模式,使服务器进入被动打开的状态;(4)接受客户端的连接请求,建立连接;(5)接收,应答客户端的数据请求;(6)终止连接。
客户端实现的步骤:(1)使用socket()函数创建套接字;(2)调用connect()函数建立一个与TCP服务器的连接;(3)发送数据请求,接收服务器的数据应答;(4)终止连接。
2.socket()函数:产生TCP套接字,作为TCP通信的传输端点。
int socket(int family,int type,int protocol);family:确定了socket使用的协议类型,值AF_INET:IPv4协议;AF_INET6:IPv6协议;AF_INET:IPv4协议。
Type:套接字类型,值:SOCK_STREAM:字节流套接口(TCP);SOCK_DGRAM:数据报套接口(UDP);SOCK_RAW:原始套接口。
Protocol:协议标志,一般值为零,如果是原始套接字就要为protocol定一个常值。
3.connect()函数:用于激发TCP的三次握手过程,建立与远程服务器的连接。
int connect(int sockfd,const struct sockaddr *addr,socklen_t addrlen);socketfd是由socket函数返回的套接字描述符;第二个参数addr是指向服务器的套接字地址结构的指针;最后一个addrlen是套接字地址结构的大小。
如果成功返回0,出错返回-1。
4.bind()函数:为调用socket()函数产生的套接字分配一个本地协议地址,建立地址与套接字的对应关系。
int bind(int sockfd,sonst struct sockaddr *server,socklen_len addrlen);第一个参数是套接字函数返回的套接字描述符;第二个是指向特定协议的指针;长度。
5.listen()函数:对于TCP服务器,在绑定操作后,必须要调用listen()函数将socket()函数创建的主动套接字转换成被动套接字,使它处在监听模式下,指示内核应接受发向该套接字的连接请求。
int listen(int sockfd,int backlog);描述符;规定的请求队列的最大连接数,6.accept()函数:使服务器接受客户端的连接请求。
当accept()函数调用成功时,可以得到3个值:(1)一个是accept()函数的返回值,已连接套接字描述符。
(2)由client参数返回客户端的协议地址,包括IP地址和端口号等。
(3)由addrlen参数返回客户端地址结构的大小。
7.send()和recv():发送和接收,它们的区别是send多了一个flags(传输控制标志)。
Flags定义:1)常规操作,与write相同;2)MSG_DONTROUTE告诉内核目的主机在本地网络上,不需要查路由表;3)MSG_DONTWAIT 将单个I/O操作设为非阻塞,执行I/O操作,然后关闭非阻塞标志;4)MSG_OBB:指明发送的是带外数据。
8. TCP使用write()函数发送数据,使用read()函数接收数据;UDP使用sendto()函数发送数据,使用recvfrom()函数接收数据。
write()函数和read()函数的用法:(P30页)第4章基本UDP套接口编程1.与默认的未连接UDP套接字相比,已连接的UDP套接字发生3个变化:(P47)1)再也不能给输出操作指定目的IP地址和端口号。
2)不能用recvfrom函数接收数据,而要用read或recv函数;3)异步错误由已连接UDP套接字返回给进程。
2.在UDP套接字编程中,服务器端实现的步骤:(1)使用socket()函数创建套接字;(2)将创建的套接字绑定到指定的地址结构;(3)等待接收客户端的数据请求;(4)处理客户端请求;(5)向客户端发送应答数据;(6)关闭套接字。
客户端实现的步骤:(1)使用socket()函数创建套接字;(2)发送数据请求给服务器;(3)等待接收服务器的数据应答;(4)关闭套接字。
第5章并发服务器1.进程的创建通过fork或者vfork,fork()函数调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:调用成功(1)>0:正值,在父进程中,fork()返回新创建子进程的进程ID;(2)=0:零,在子进程中,fork返回0;调用不成功(3)<0:负值,如果出现错误,fork返回一个负值,此时没有创建新的进程,最初的进程仍在运行。
3.fork与vfork创建进程区别:vfork和fork一样都创建一个子进程,但是它并不将父进程的地址空间完全复制到子进程中,不会复制页表。
fork创建一个子进程时,将会创建一个新的地址空间,并且拷贝父进程的资源;vfork产生的子进程刚开始暂时与父进程共享地址空间(其实就是线程的概念),因为这时候子进程在父进程的地址空间中运行,所以子进程不能进行写操作,一旦子进程执行了exec或者exit后,父子进程分开。
vfork和fork之间的另一个区别是:vfork保证子进程先运行,在她调用exec或exit之后父进程才可能被调度运行。
如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。
4.结合下图,说明四次close都干什么了(不知道):当fork函数返回后,与监听和已连接描述符相关联的文件表项访问计数值均加1。
当父进程调用close关闭已连接的描述符时,只将访问计数值减1,而描述符只在访问计数为0时才真正关闭,所以为了正确的关闭连接,当调用fork函数后父进程将不需要的已连接描述符关闭,子进程关闭不需要的监听描述符。
如图,服务器调用accept函数时,连接请求从客户到达服务器时双方状态如图一;客户的连接请求呗服务器接收后,新的已连接套接字即connfd被创建,如图二;调用fork函数,此时描述符listenfd和connfd在父子进程间共享,如图三;父进程关闭已连接描述符,子进程关闭监听描述符,如图四;此时就是套接字的最终状态,子进程处理与客户的连接,父进程再次处理下一个请求。