[MFC学习笔记]--网络编程理论知识

1.IP地址在网络上,可以唯一标识一台主机。采用点分十进制的表示方法。[身份识别]
2.还要有通信协议,这样才能认识彼此。但是一台主机有多个网络应用程序,所以必须采用端口号来标识网络应用程序。
3.IP是逻辑地址,具有全球唯一性
4.网络体系结构为了解决异质性问题


5.OSI(open system interconnection)参考模型:应用层,表示层,会话层,传输层,网络层,数据链路层,物理层
物理层:二进制传输,确定在传输介质上怎么传输数据比特
数据链路层:介质访问(接入),加强物理层的传输功能,建立一条无差错的传输线路
网络层:提供IP寻址和路由,因为在网络上,数据到达目的地,可以有多条线路,网络层就负责找出最佳的传输线路
传输层:提供源端主机到目的地主机提供可靠的数据传输服务,隔离网络的上下层协议,使得网络应用和下层协议无关。
会话层:在两个相互通信的应用进程之间 ,建立组织和协调其相互之间的通信
表示层:表示层处理被传输数据的表示问题,即信息的语法与语义,如有必有,使用一种通用的数据表示格式,在多种数据表示格式之间进行转换,还有数据的加密解密,压缩解压
应用层:为用户的应用程序提供网络通信等服务
6.各层之间是严格单向依赖
7.上层使用下层提供的服务Service user
8.下层为上层提供服务Service provider

OSI各层所使用的协议
应用层:Telnet远程登陆协议、FTP文件传输协议、超文本传输协议HTTP、域名服务DNS、简单邮件传输协议SMTP、邮局协议POP3
             DNS:比如www.163.com就是一个域名,通过DNS就可以将域名解析为网易的IP地址,通过IP地址我们就可以访问网易的服务器了。
             SMTP:我们发送电子邮件的时候就会用到
             POP3:我们接收一封电子邮件的时候就会用到
传输层:传输控制协议TCP、用户数据报协议UDP。
            TCP是面向连接的可靠的传输协议,建立连接要三次握手。
            UDP是无连接的,不可靠的传输协议。可能会掉数据,但是速度快,比如视频会议。
网络层:网际协议IP、Internet互联网控制报文协议ICMP、Internet组管理协议IGMP

数据封装:一台计算机要发送数据到另外一台计算机,数据首先要打包,打包的过程称为封装。封装就是在数据面前加上特定的协议头部
比如,应用层的数据传输到传输层的时候,要在数据前面加上TCP头,传输到网络层的时候,就必须加上IP头

1.在OSI参考模型中,对等层协议之间交换的信息单元统称为协议数据单元(PDU :PROTOCOL DATA UNIT)
2.为了提供服务,下层把上层的PDU作为本层的数据封装,然后加入本层的头部(和尾部)。头部中含有完成数据传输所需的控制信息
   这样,数据自上而下递交的过程实际上就是不断封装的过程,到达目的地后自下而上递交的过程就是不断拆封的过程。由此可知,在
   物理线路上传输的数据,其实外面实际上被包封了多层“信封”。
   但是,某一层只能识别对等层封装的“信封”,而对于被封装在“信封”内部的数据仅仅是拆封后将其递交给上层,本层不做任何处理

TCP\IP模型包括四个层次:
应用层(应用层,表示层,会话层)
<端口>:应用程序通过端口往下传数据,和接收数据
传输层(传输层)
网络层(网络层)
网络接口(数据链路层,物理层)

套接字socket:一种应用程序访问通信协议的操作系统调用socket,使得程序员可以很方便地访问TCP\IP

套接字存在于通信区域中,通信区域又叫地址族,他是一个抽象概念,主要用于将通过套接字通信的进程的共有特性综合在一起
套接字通常只与同一区域的套接字交换数据(也可能跨区域通信,但这只在执行了某种转换进程后才能实现)。windows socket只支持
一个通信区域:网际域(AF_INET)这个域被使用网际协议簇通信的进程使用。

不同计算机存放多字节值的顺序不同,有的机器在起始地址存放低位字节(低位先存),有的机器在起始地址存放高位字节(高位先存)。基于Intel
的CPU及我们常用的PC,是低位先存。为了保证数据的正确性,在网络协议中需要制定网络字节顺序,TCP\IP协议使用16位整数和32位整数的高位先存格式。

 

 

 

SOCK_STREAM实际上是基于TCP协议实现的。SOCK_DGRAM实际上是基于UDP实现的。

 

 

一个socket句柄代表两个地址对   “本地ip:port”--“远程ip:port”

1.   每一个socket   本质上都是指一个ip地址和端口对 
2.   为了操作这样的地址对,使用了文件描述符 
3.   socket()函数只创建了一个普通的文件描述符,在进行bind()或者connect()之前并不能说创建了用于网络通讯的套接字 
4.   只有在进行了bind()或者connect()之后socket才被创立起来

socket()创建了一个socket内核对象。 
accept或者connect后,才可以对socket句柄读写。因为只有在   connect或者bind,listen,accept后才会设置好socket内核对象里边的ip和端口 

一个socket句柄代表两个地址对 “本地ip:port”--“远程ip:port” 
在windows下叫句柄,在linux下叫文件描述符 

 

在使用socket编程时,我们都知道在网络通信以前首先要建立连接,而连接的建立是通过对socket的一些操作来完成的。那么,建立连接的过程大致可以分为以下几步: 
1) 建立socket套接字。 
2) 给套接字赋予地址,这个地址不是通常的网络地址的概念。 
3) 建立socket连接。 

1. 建立socket套接字。 
使用socket建立套接字的时候,我们实际上是建立了一个数据结构。这个数据结构最主要
的信息是指定了连接的种类和使用的协议,此外还有一些关于连接队列操作的结构字段
(这里就先不涉及他们了)。 
当我们使用socket函数以后,如果成功的话会返回一个int型的描述符,它指向前面那个
被维护在内核里的socket数据结构。我们的任何操作都是通过这个描述符而作用到那个数
据结构上的。这就像是我们在建立一个文件后得到一个文件描述符一样,对文件的操作都
是通过文件描述符来进行的,而不是直接作用到inode数据结构上。我之所以用文件描述
符举例,是因为socket数据结构也是和inode数据结构密切相关,它不是独立存在于内核
中的,而是位于一个VFS inode结构中。所以,有一些比较抽象的特性,我们可以用文件
操作来不恰当的进行类比以加深理解。 
如前所述,当建立了这个套接字以后,我们可以获得一个象文件描述符那样的套接字描述
。就象我们对文件进行操作那样,我们可以通过向套接字里面写数据将数据传送到我们
指定的地方,这个地方可以是远端的主机,也可以是本地的主机。如果你有兴趣的话,还
可以用socket机制来实现IPC,不过效率比较低,试试也就行了(我没有试过)。 

2. 给套接字赋予地址。 
依照建立套接字的目的不同,赋予套接字地址的方式有两种:服务器端使用bind,客户端
使用connetc。 
Bind: 
我们都知道,只要使用IP, prot就可以区分一个tcp/ip连接(当然这个连接指的是一个
连接通道,如果要区分特定的主机间的连接,还需要第三个属性 hostname)。 
我们可以使用bind函数来为一个使用在服务器端例程中的套接字赋予通信的地址和端口。
在这里我们称通信的IP地址和端口合起来构成了一个socket地址,而指定一个socket使
用特定的IP和port组合来进行通行的过程就是赋予这个socket一个地址。 
要赋予socket地址,就得使用一个数据结构来指明特定的socket地址,这个数据结构就
是struct sockaddr。对它的使用我就不说了,因为这篇文档的目的是澄清概念而不是说
明使用方法。Bind函数的作用就是将这个特定的标注有socket地址信息的数据结构和
socket套接字联系起来,即赋予这个套接字一个地址。但是在具体实现上,他们两个是怎
么联系在一起的,我还不知道。 
一个特定的socket的地址的生命期是bind成功以后到连接断开前。你可以建立一个
socket数据结构和socket地址的数据结构,但是在没有bind以前他们两个是没有关系
的,在bind以后他们两个才有了关系。这种关系一直维持到连接的结束,当一个连接结束
时,socket数据结构和socket地址的数据结构还都存在,但是他们两个已经没有关系
了。如果你要是用这个套接字在socket地址上重新进行连接时,需重新bind他们两个。再
注明一次,我说的这个连接是一个连接通道,而不是特定的主机之间的连接。 
Bind指定的IP通常是本地IP(一般不特别指定,而使用INADDR_ANY来声明),而最主要
的作用是指定端口。在服务器端的socket进行了bind以后就是用listen来在这个socket
地址上准备进行连接。 
connect: 
对于客户端来说,是不会使用bind的(并不是不能用,但没什么意义),他们会通过
connet函数来建立socket和socket地址之间的关系。其中的socket地址是它想要连接的
服务器端的socket地址。在connect建立socket和socket地址两者关系的同时,它也在
尝试着建立远端的连接。 
3. 建立socket连接。 
对于准备建立一个连接,服务器端要两个步骤:bind, listen;客户端一个步骤:
connct。如果服务器端accept一个connect,而客户端得到了这个accept的确认,那么
一个连接就建立了。

 

客户/服务器模式模式的理解

    客户/服务器模式采取的是主动请求方式:

    首先服务器方要先启动,并根据请求提供相应服务:

    1. 打开一通信通道并告知本地主机,它愿意在某一公认地址上(周知口,如FTP为21)接收客户请求;

    2. 等待客户请求到达该端口;

    3. 接收到重复服务请求,处理该请求并发送应答信号。接收到并发服务请求,要激活一新进程来处理这个客户请求(如UNIX系统中用fork、exec)。新进程处理此客户请求,并不需要对其它请求作出应答。服务完成后,关闭此新进程与客户的通信链路,并终止。

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

    5. 关闭服务器

    客户方:

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

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

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

    从上面所描述过程可知:

    1. 客户与服务器进程的作用是非对称的,因此编码不同。

    2. 服务进程一般是先涌进用户请求而启动的。只要系统运行,该服务进程一直存在,直到正常或强迫终止。

以上文字资料来自:http://blog.csdn.net/yeyuangen/article/details/6799575  在此感谢博主 YEYUANGEN 

 


 

 

 

 

 

 

                 

 

 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值