socket端口号.doc_第1页
socket端口号.doc_第2页
socket端口号.doc_第3页
socket端口号.doc_第4页
socket端口号.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

socket端口号 socket端口号篇一:socket和端口理解 socket和端口理解.txt爱一个人很难,恨一个人更难,又爱又恨的人最难。爱情永远不可能是天平,想在爱情里幸福就要舍得伤心!有些烦恼是我们凭空虚构的,而我们却把它当成真实去承受。socket和端口理解2009-05-19 00:03/ 一个socket句柄代表两个地址对 “本地ip:port”-“远程ip:port” 在windows下叫句柄,在linux下叫文件描述符 socket为内核对象,由操作系统内核来维护其缓冲区,引用计数,并且可以在多个进程中使用。 至于称它为“句柄”“文件描述符”都是一样的 //aezealer/blog/item/3b1582f4909da9e77609d795.html转载于 首先,随着时间的推移,我会不断地向这篇里面加东西,知道我认为应该结束了为止。 这篇实际上是我的学习小结的一部分,所以如果有人能够来信指出其中的错误或不 足,那我可是感激淋涕了。 我假定读者已经对于socket连接的建立过程和各种状态转换比较熟悉了,因为这篇文档的 目的是澄清概念,而不是介绍概念。 在使用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的确认,那么 一个连接就建立了。socket端篇二:Socket端口 Socket端口 2007年07月09日 星期一 14:54 转载自:http:/bbs.(来自:WWw.xMsjoB.com 厦门 培训考试 网:socket端口号)5/thread-13-1-1.html 要写网络程序就必须用Socket,这是程序员都知道的。而且,面试的时候,我们也会问对方会不会Socket编程?一般来说,很多人都会说,Socket编程基本就是listen,accept以及send,write等几个基本的操作。是的,就跟常见的文件操作一样,只要写过就一定知道。 对于网络编程,我们也言必称TCP/IP,似乎其它网络协议已经不存在了。对于TCP/IP,我们还知道TCP和UDP,前者可以保证数据的正确和可靠性,后者则允许数据丢失。最后,我们还知道,在建立连接前,必须知道对方的IP地址和端口号。除此,普通的程序员就不会知道太多了,很多时候这些知识已经够用了。最多,写服务程序的时候,会使用多线程来处理并发访问。 我们还知道如下几个事实: 1。一个指定的端口号不能被多个程序共用。比如,如果IIS占用了80端口,那么Apache就不能也用80端口了。 2。很多防火墙只允许特定目标端口的数据包通过。 3。服务程序在listen某个端口并accept某个连接请求后,会生成一个新的socket来对该请求进行处理。 于是,一个困惑了我很久的问题就产生了。如果一个socket创建后并与80端口绑定后,是否就意味着该socket占用了80端口呢?如果是这样的,那么当其accept一个请求后,生成的新的socket到底使用的是什么端口呢(我一直以为系统会默认给其分配一个空闲的端口号)?如果是一个空闲的端口,那一定不是80端口了,于是以后的TCP数据包的目标端口就不是80了-防火墙一定会组织其通过的!实际上,我们可以看到,防火墙并没有阻止这样的连接,而且这是最常见的连接请求和处理方式。我的不解就是,为什么防火墙没有阻止这样的连接?它是如何判定那条连接是因为connet80端口而生成的?是不是TCP数据包里有什么特别的标志?或者防火墙记住了什么东西? 后来,我又仔细研读了TCP/IP的协议栈的原理,对很多概念有了更深刻的认识。比如,在TCP和UDP同属于传输层,共同架设在IP层(网络层)之上。而IP层主要负责的是在节点之间(End to End)的数据包传送,这里的节点是一台网络设备,比如计算机。因为IP层只负责把数据送到节点,而不能区分上面的不同应用,所以TCP和UDP协议在其基础上加入了端口的信息,端口于是标识的是一个节点上的一个应用。除了增加端口信息,UPD协议基本就没有对IP层的数据进行任何的处理了。而TCP协议还加入了更加复杂的传输控制,比如滑动的数据发送窗口(Slice Window),以及接收确认和重发机制,以达到数据的可靠传送。不管应用层看到的是怎样一个稳定的TCP数据流,下面传送的都是一个个的IP数据包,需要由TCP协议来进行数据重组。 所以,我有理由怀疑,防火墙并没有足够的信息判断TCP数据包的更多信息,除了IP地址和端口号。而且,我们也看到,所谓的端口,是为了区分不同的应用的,以在不同的IP包来到的时候能够正确转发。 TCP/IP只是一个协议栈,就像操作系统的运行机制一样,必须要具体实现,同时还要提供对外的操作接口。就像操作系统会提供标准的编程接口,比如Win32编程接口一样,TCP/IP也必须对外提供编程接口,这就是Socket编程接口-原来是这么回事啊! 在Socket编程接口里,设计者提出了一个很重要的概念,那就是socket。这个socket跟文件句柄很相似,实际上在BSD系统里就是跟文件句柄一样存放在一样的进程句柄表里。这个socket其实是一个序号,表示其在句柄表中的位置。这一点,我们已经见过很多了,比如文件句柄,窗口句柄等等。这些句柄,其实是代表了系统中的某些特定的对象,用于在各种函数中作为参数传入,以对特定的对象进行操作-这其实是C语言的问题,在C+语言里,这个句柄其实就是this指针,实际就是对象指针啦。 现在我们知道,socket跟TCP/IP并没有必然的联系。Socket编程接口在设计的时候,就希望也能适应其他的网络协议。所以,socket的出现只是可以更方便的使用TCP/IP协议栈而已,其对TCP/IP进行了抽象,形成了几个最基本的函数接口。比如create,listen,accept,connect,read和write等等。 现在我们明白,如果一个程序创建了一个socket,并让其监听80端口,其实是向TCP/IP协议栈声明了其对80端口的占有。以后,所有目标是80端口的TCP数据包都会转发给该程序(这里的程序,因为使用的是Socket编程接口,所以首先由Socket层来处理)。所谓accept函数,其实抽象的是TCP的连接建立过程。accept函数返回的新socket其实指代的是本次创建的连接,而一个连接是包括两部分信息的,一个是源IP和源端口,另一个是宿IP和宿端口。所以,accept可以产生多个不同的socket,而这些socket里包含的宿IP和宿端口是不变的,变化的只是源IP和源端口。这样的话,这些socket宿端口就可以都是80,而Socket层还是能根据源/宿对来准确地分辨出IP包和socket的归属关系,从而完成对TCP/IP协议的操作封装!而同时,放火墙的对IP包的处理规则也是清晰明了,不存在前面设想的种种复杂的情形。 明白socket只是对TCP/IP协议栈操作的抽象,而不是简单的映射关

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论