网络编程学习笔记

来源:互联网 发布:kmp算法 编辑:程序博客网 时间:2024/04/29 04:24

1. :

    T C P / I P协议族分、网络层、运输层,每一各有不同的任。T C P / I P中,网络层和运输层的区是最的:网络层 I P)提供点到点的服而运输层 T C PU D P)提供端到端的服。这三层通常是在操作系统内核中实现。因此用户一般不涉及。编程时,编程界面有两种形式:一、是由内核心直接提供的系统调用;二、使用以库函数方式提供的各种函数。前者为核内实现,后者为核外实现。用户服务要通过核外的应用程序才能实现,所以要使用套接字(socket)来实现。

 

2. 数据链路层协议列举:

PPP:点对点协议

 

3. IP地址的计算

    16位是网络号, 即:

10** ****

A

110* ****

B

1110 ****

C

1111 0***

D

1111 1***

E

    特殊的IP地址:

127.*.*.1

环回地址

192*.*.*

局域地址

*.*.*.0

不能作为目标地址

*.*.*.255

不能作为源地址,广播地址

 

4. 子网掩码:

    除了I P地址以外,主机还需要知道有多少比特用于子网号及多少比特用于主机号。这是在引导过程中通过子网掩码来确定的。这个掩码是一个32 bit的值,其中值为1的比特留给网络号和子网号,为0的比特留给主机号。

   

5.网络协议简介:

  IP 网间协议(Internet Protocol) 负责主机间数据的路由和网络上数据的存储。同时为ICMPTCPUDP提供分组发送服务。用户进程通常不需要涉及这一层。

  ARP 地址解析协议(Address Resolution Protocol)

   此协议将网络地址映射到硬件地址。

  RARP 反向地址解析协议(Reverse Address Resolution Protocol)

   此协议将硬件地址映射到网络地址

  ICMP 网间报文控制协议(Internet Control Message Protocol)

   此协议处理信关和主机的差错和传送控制。

  TCP 传送控制协议(Transmission Control Protocol)

   这是一种提供给用户进程的可靠的全双工字节流面向连接的协议。它要为用户进程提供虚电路服务,并为数据可靠传输建立检查。(注:大多数网络用户程序使用TCP

  UDP 用户数据报协议(User Datagram Protocol)

   这是提供给用户进程的无连接协议,用于传送数据而不执行正确性检查。

  FTP 文件传输协议(File Transfer Protocol)

   允许用户以文件操作的方式(文件的增、删、改、查、传送等)与另一主机相互通信。

  SMTP 简单邮件传送协议(Simple Mail Transfer Protocol)

   SMTP协议为系统之间传送电子邮件。

  TELNET:终端协议(Telnet Terminal Procotol)

   允许用户以虚终端方式访问远程主机

  HTTP 超文本传输协议(Hypertext Transfer Procotol)  

  TFTP: 简单文件传输协议(Trivial File Transfer Protocol)

 

6. 网间进程通信:

    进程通信的概念最初来源于单机系统。由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施,如UNIX BSD中的管道(pipe)、命名管道(named pipe)和软中断信号(signal),UNIX system V的消息(message)、共享存储区(shared memory)和信号量(semaphore)等,但都仅限于用在本机进程之间通信。网间进程通信要解决的是不同主机进程间的相互通信问题(可把同机进程通信看作是其中的特例)。为此,首先要解决的是网间进程标识问题。这时不能在用进程号(process ID)唯一标识,需要通过(协议,本地地址,本地端口号)来表示其唯一性。

    其次,操作系统支持的网络协议众多,不同协议的工作方式不同,地址格式也不同。因此,网间进程通信还要解决多重协议的识别问题。为了解决上述问题,TCP/IP协议引入了下列几个概念。

    端口:网络中可以被命名和寻址的通信端口,是操作系统可分配的一种资源。按照OSI七层协议的描述,传输层与网络层在功能上的最大区别是传输层提供进程通信能力。从这个意义上讲,网络通信的最终地址就不仅仅是主机地址了,还包括可以描述进程的某种标识符。为此,TCP/IP协议提出了协议端口(protocol port,简称端口)的概念,用于标识通信的进程。

    端口是一种抽象的软件结构(包括一些数据结构和I/O缓冲区)。应用程序(即进程)通过系统调用与某端口建立连接(binding)后,传输层传给该端口的数据都被相应进程所接收,相应进程发给传输层的数据都通过该端口输出。在TCP/IP协议的实现中,端口操作类似于一般的I/O操作,进程获取一个端口,相当于获取本地唯一的I/O文件,可以用一般的读写原语访问之。

    类似于文件描述符,每个端口都拥有一个叫端口号(port number)的整数型标识符,用于区别不同端口。由于TCP/IP传输层的两个协议TCPUDP是完全独立的两个软件模块,因此各自的端口号也相互独立,如TCP有一个255号端口,UDP也可以有一个255号端口,二者并不冲突。

    端口号的分配是一个重要问题。有两种基本分配方式:第一种叫全局分配,这是一种集中控制方式,由一个公认的中央机构根据用户需要进行统一分配,并将结果公布于众。第二种是本地分配,又称动态连接,即进程需要访问传输层服务时,向本地操作系统提出申请,操作系统返回一个本地唯一的端口号,进程再通过合适的系统调用将自己与该端口号联系起来(绑扎)。TCP/IP端口号的分配中综合了上述两种方式。TCP/IP将端口号分为两部分,少量的作为保留端口,以全局方式分配给服务进程。因此,每一个标准服务器都拥有一个全局公认的端口(即周知口,well-known port),即使在不同机器上,其端口号也相同。剩余的为自由端口,以本地方式进行分配。TCPUDP均规定,小于256的端口号才能作保留端口。

    地址:网络通信中通信的两个进程分别在不同的机器上。在互连网络中,两台机器可能位于不同的网络,这些网络通过网络互连设备(网关,网桥,路由器等)连接。因此需要三级寻址:

l         某一主机可与多个网络相连,必须指定特定网络地址;

l         网络上每一台主机应有其唯一的地址;

l         每一主机上的每一进程应有在该主机上的唯一标识符。

    通常主机地址由网络ID和主机ID组成,在TCP/IP协议中用32位整数值表示;TCPUDP均使用16位端口号标识用户进程。

    网络字节顺序:不同的计算机存放多字节值的顺序不同,有的机器在起始地址存放低位字节(低价先存),有的存高位字节(高价先存)。为保证数据的正确性,在网络协议中须指定网络字节顺序。TCP/IP协议使用16位整数和32位整数的高价先存格式,它们均含在协议头文件中。

    连接:两个进程间的通信链路称为连接。连接在内部表现为一些缓冲区和一组协议机制,在外部表现出比无连接高的可靠性。

    半相关:网络中用一个三元组可以在全局唯一标志一个进程:(协议,本地地址,本地端口号)

    全相关:一个完整的网间进程通信需要由两个进程组成,并且只能使用同一种高层协议。也就是说,不可能通信的一端用TCP协议,而另一端用UDP协议。因此一个完整的网间通信需要一个五元组来标识:(协议,本地地址,本地端口号,远地地址,远地端口号)

 

7. 客户机/服务器模式

  在TCP/IP网络中两个进程间的相互作用的主机模式是客户机/服务器模式(Client/Server model)。该模式的建立基于以下两点:1、非对等作用;2、通信完全是异步的。客户机/服务器模式在操作过程中采取的是主动请示方式:

  首先服务器方要先启动,并根据请示提供相应服务:(过程如下)

  1、打开一通信通道并告知本地主机,它愿意在某一个公认地址上接收客户请求。

  2、等待客户请求到达该端口。

  3、接收到重复服务请求,处理该请求并发送应答信号。

  4、返回第二步,等待另一客户请求

  5、关闭服务器。

 

  客户方:

  1、打开一通信通道,并连接到服务器所在主机的特定端口。

  2、向服务器发送服务请求报文,等待并接收应答;继续提出请求……

  3、请求结束后关闭通信通道并终止。

面向接的套接字的系统调

 

协议的套接字

 

 

8. 服务器模型

    循环服务器UDP UDP服务器每次从套接字上读取一个客户端的请求,处理, 然后将结果返回给客户机。没有一个客户端可以老是占住服务端,对于每一个客户机的请求总是能够满足. 

    循环服务器TCP TCP服务器接受一个客户端的连接,然后处理,完成了这个客户的所有请求后,断开连接. 只要客户不断开连接服务就被一直占用,很少使用。

 

并发服务器TCP: 并发服务器的思想是每一个客户机的请求并不由服务器直接处理,而是服务器创建一个 子进程来处理。它可以解决器客户机独占服务器的情况,不过创建子进程是一种非常消耗资源的操作.

    并发服务器多路复用I/Oselect 

int select(int nfds,fd_set *readfds,fd_set *writefds,

                fd_set *except fds,struct timeval *timeout)

 void FD_SET(int fd,fd_set *fdset)

 void FD_CLR(int fd,fd_set *fdset)

 void FD_ZERO(fd_set *fdset)

 int FD_ISSET(int fd,fd_set *fdset)

    一般的来说当我们读写文件时,进程有可能在读写出阻塞,直到一定的条件满足。比如我们从一个套接字读数据时,可能缓冲区里面没有数据可读(通信的对方还没有发送数据过来),这个时候我们的读调用就会等待(阻塞),直到有数据可读。如果我们不希望阻塞,我们的一个选择是用select系统调用。只要我们设置好select的各个参数,那么当文件可以读写的时候select"通知"我们说可以读写了.

l         readfds所有要读的文件文件描述符的集合

l         writefds所有要的写文件文件描述符的集合

l         exceptfds其他的服要向我们通知的文件描述符

l         timeout超时设置

l         nfds所有我们监控的文件描述符中最大的那一个加1

    在我们调用select时进程会一直阻塞直到以下的一种情况发生. 1)有文件可以读;2)有文件可以写;3)超时所设置的时间到。为了设置文件描述符我们要使用几个宏.

l         FD_SETfd加入到fdset 

l         FD_CLRfdfdset里面清除

l         FD_ZEROfdset中清除所有的文件描述符

l         FD_ISSET判断fd是否在fdset集合中

使用select的一个例子:

int use_select(int *readfd,int n)

{

        fd_set my_readfd;

        int maxfd;

        int i;

       

        maxfd=readfd[0];       

        for(i=1;i<n;i++)

        {

            if(readfd[i]>maxfd) maxfd=readfd[i];

        }       

       

        while(1)

        {

            /* 将所有的文件描述符加入 */

            FD_ZERO(&my_readfd);           

            for(i=0;i<n;i++)

            FD_SET(readfd[i],*my_readfd);

           

            /* 进程阻塞 */

            select(maxfd+1,& my_readfd,NULL,NULL,NULL);

           

            /* 有东西可以读了 */

            for(i=0;i<n;i++)

            {

                if(FD_ISSET(readfd[i],&my_readfd))

                {

                        /* 原来是我可以读了 */

                        we_read(readfd[i]);

                }

            }

        }

}

 

使用select后我们的服务器程序就变成了.

while(1)

{

        设置监听读写文件描述符(FD_*);

       

        调用select;

       

        如果是倾听套接字就绪,说明一个新的连接请求建立

        {

            建立连接(accept);

            加入到监听文件描述符中去;

        }

        否则说明是一个已经连接过的描述符

        {

            进行操作(read或者write);

        }

}

多路复用I/O可以解决资源限制的问题.着模型实际上是将UDP循环模型用在了TCP上面. 这也就带来了一些问题.如由于服务器依次处理客户的请求,所以可能会导致有的客户会等待很久.

并发服务器UDP: 人们把并发的概念用于UDP就得到了并发UDP服务器模型. 并发UDP服务器模型和并发的TCP服务器模型一样:创建一个子进程来处理的客户请求。.

 

9. ISOOpen System Interconnect)七层模型

    1)应用层:与其他计算机进行通讯的一个应用,它是对应应用程序的通信服务的。例如,一个没有通信功能的字处理程序就不能执行通信的代码,从事字处理工作的程序员也不关心OSI的第7层。但是,如果添加了一个传输文件的选项,那么字处理器的程序员就需要实现OSI的第7层。示例:telnetHTTP,FTP,WWW,NFS,SMTP等。

    2)表示层:这一层的主要功能是定义数据格式及加密。例如,FTP允许你选择以二进制或ASII格式传输。如果选择二进制,那么发送方和接收方不改变文件的内容。如果选择ASII格式,发送方将把文本从发送方的字符集转换成标准的ASII后发送数据。在接收方将标准的ASII转换成接收方计算机的字符集。示例:加密,ASII等。

    3)会话层:他定义了如何开始、控制和结束一个会话,包括对多个双向小时的控制和管理,以便在只完成连续消息的一部分时可以通知应用,从而使表示层看到的数据是连续的,在某些情况下,如果表示层收到了所有的数据,则用数据代表表示层。示例:RPCSQL等。

    4)传输层:这层的功能包括是否选择差错恢复协议还是无差错恢复协议,及在同一主机上对不同应用的数据流的输入进行复用,还包括对收到的顺序不对的数据包的重新排序功能。示例:TCPUDPSPX

    5)网络层:这层对端到端的包传输进行定义,他定义了能够标识所有结点的逻辑地址,还定义了路由实现的方式和学习的方式。为了适应最大传输单元长度小于包长度的传输介质,网络层还定义了如何将一个包分解成更小的包的分段方法。示例:IP,IPX等。

    6)数据链路层:他定义了在单个链路上如何传输数据。这些协议与被讨论的歌种介质有关。示例:ATMFDDI等。

    7)物理层:OSI的物理层规范是有关传输介质的特性标准,这些规范通常也参考了其他组织制定的标准。连接头、针、针的使用、电流、电流、编码及光调制等都属于各种物理层规范中的内容。物理层常用多个规范完成对所有细节的定义。示例:Rj45802.3等。

 

    网络七层结构优点:它体现了层次间的无关性:高层系统只需要了解较低一层系统的功能和接口,可以更好的关注本层系统的设计与实现,这样极大的简化了系统的复杂性。可扩展性:针对同样的功能,我可以在保证提供相同接口的情况下,提供不同的实现方式来满足各种需求。其实在我们平时在设计系统考虑好了结构层次,不但能简化复杂性,减小风险,还能开发和测试上节省项目管理成本。软件开发有一个这样的原则,系统设计的越好,项目管理成本越低的越好,产品质量越好,开发也会相对轻松。

 

    网络协议:主要由语义、语法、时序三部分来定义数据传输的顺序、数据的格式及内容等方面有一个约定或规则,从而保证网络中的计算机与终端间要想正确的传送信息和数据。

 

    协议栈:在网络中,为了完成通信,必须使用多层上的多种协议。这些协议按照层次顺序组合在一起,构成了协议栈(Protocol Stack),也称为协议族(Protocol Suite)