程琳,邑,莫桑石-大坑视线-专注闭坑-重新发现价值

频道:新闻世界 日期: 浏览:240

三者从本质上来说没有可比性, socket则是对TCP/IP协议的封装和运用(程序员层面上)。 也能够说,TPC/IP协议是传输层协议,首要处理数据怎样在网络中传输, 而HTTP是运用层协议,首要处理怎样包装数据。 关于TCP/IP和HTTP协议的联络,网络有一段比较简单了解的介绍: “我们在传输数据时,能够只运用(传输层)TCP/IP协议,可是那样的话,假如没有运用层,便无法辨认数据内容。 假如想要使传输的数据有意义,则有必要运用到运用层协议。 运用层协议有许多,比方HTTP、FTP、TELNET等,也能够自己界说运用层协议。 WEB运用HTTP协议作运用层协议,以封装HTTP文本信息,然后运用TCP/IP做传输层协议将它发到网络上。” 而我们平常说的最多的socket是什么呢,实际上socket是对TCP/IP协议的封装,Socket自身并不是协议,而是一个调用接口(API)。 经过Socket,我们才干运用TCP/IP协议。 实际上,Socket跟TCP/IP协议没有必定的联络。 Socket编程接口在规划的时分,就期望也能习惯其他的网络协议。 所以说,Socket的呈现仅仅使得程序员更方便地运用TCP/IP协议栈罢了,是对TCP/IP协议的笼统, 然后形成了我们知道的一些最基本的函数接口,比方create、listen、connect、accept、send、read和write等等。 网络有一段关于socket和TCP/IP协议联络的说法比较简单了解: “TCP/IP仅仅一个协议栈,就像操作体系的运转机制相同,有必要要详细完成,一同还要供给对外的操作接口。 这个就像操作体系会供给规范的编程接口,比方win32编程接口相同, TCP/IP也要供给可供程序员做网络开发所用的接口,这便是Socket编程接口。” 关于TCP/IP协议的相关仅仅,用博学多才来讲我想也不为过,单单查一下网上关于此类仅仅的材料和书本文献的数量就知道,

他总算了解了所谓IP层便是把数据分组从一个主机跨过千山万水转移到其他一主机, 而且这转移服务一点都不牢靠, 丢包、重复、失序能够说是粗茶淡饭, 怪不得说是“尽力而为”, 基本上无所作为。

脏活累活只好让TCP来做了, 在两个主机的运用(进程)之间经过失利重传来完成牢靠性的传输。

张大胖常常慨叹:这树立一个TCP衔接可是适当的杂乱, 我的程序得先和远端的服务器打个招待, 然后它再给我打个招待承认, 我还得再给它承认下。 这还不算完, 我们的招待中还得各自带上各自的序号, 这将来传输真实的数据时用到。

详细的传输就更麻烦了, 什么滑动窗口,什么累积承认、分组缓存、流量操控, 几乎不是人做的作业。

到了断开衔接的时分, 还得考虑友爱分手!

可是领导居然让张大胖用这个超级杂乱的TCP协议来编程, 来规划一个客户端和服务器端的通讯体系。

张大胖掂量了下自己, 觉得必定搞不定, 所以赶忙向自己的好基友,编程大神Bill求救, Bill 在电话里说: “这很简单啊,你去看看TCP/IP协议的RFC, 然后用C言语编程完成不就行了吗。”

张大胖心想这等于啥也没说, 持续“跪求” 。 Bill 总算说:“等着吧, 我下周给你”

Socket

周一, Bill公然带着7、8张软盘来找张大胖了, 把软盘的程序别离Copy到了两个电脑里, 一个模仿客户端, 一个模仿服务器。 很快程序运转起来了, 两个电脑能够经过TCP通讯了。

张大胖说: “大神, 你是怎样做到的?”

Bill说:“TCP协议确实很杂乱, 我们不能要求每个程序员都去完成树立衔接的3次握手, 累积承认,分组缓存, 这些应该是归于操作体系内核的部分, 没必要重复开发, 可是关于运用程序来讲, 操作体系需求笼统出一个概念, 让上层运用去编程。 “

“什么概念?”

“socket”

”为啥叫socket? “

"一个比方罢了, 就像插座相同, 一个插头插进插座, 树立了衔接。 不过我规划这个socket 能够了解为 (客户端IP, 客户端Port, 服务器端IP, 服务器端Port), 对了, Port便是端口, 浅显点讲便是一个数字罢了"

“如同不必port就能够吧, 由于我们这是两个机器之间的通讯, IP是不是就够了?”

Bill 说:“看来你忘了, TCP是两个进程之间的通讯, 客户端上能够有许多进程一同拜访多个服务器, 服务器上也有多个进程对外供给服务, 必定要区别隔啊”

张大胖不好意思的说: “本来端口号便是用来区别进程的, 这样IP层发过来的数据包, 抵达TCP层今后就能够分发给各个运用程序了。 ”

“对的, 这叫多路复用。 一般来说, 服务器端都是被迫拜访的, 所以我们需求知道它供给服务的端口号, 要不然怎样衔接? 例如80, 443等, 便是所谓闻名端口号; 而客户端拜访服务器的时分,自己的端口号能够随机生成一个, 只需不好其他运用抵触即可。”

Socket编程

张大胖问道: “那详细怎样运用你的Socket来编程? ”

“这要分为客户端和服务器端,两者不相同, 对客户端来讲很简单, 你需求创立一个socket, 然后向服务器建议衔接, 衔接上今后就能够发送,接纳数据了, 你看看这段伪代码“

"恩, 笼统今后公然是不相同, 那些烦人的细节都被躲藏了, 只剩下一些概念性的东西, 用起来很清新, 这个clientfd 我猜便是一个像文件描述符那样的东西吧? 翻开文件就会有一个"

“对的, 很好的类比, 留意,在上面的伪码中,没有呈现客户端的ip和端口, 体系能够主动取得IP, 也能够主动分配端口。 还有, 看到那个connect 函数没有, 其实便是在和服务器建议三次握手呢。 ”

“那服务器怎样呼应?”

“服务器端要杂乱一些, 你想想看, 榜首, 服务器是被迫的, 所以它发动今后, 需求监听客户端建议的衔接, 第二, 服务器要敷衍许多的客户端建议衔接, 所以它必定得各个socket给区别隔了, 要不就乱了套了, 伪代码是这个姿态的:”

张大胖说: “公然是杂乱多了, listenfd ,从称号看便是为了要监听而创立的socket描述符吧, bind 是干嘛? 嗯, 我猜是为了声明说我要占用这个端口了啊, 你们都别用了, listen函数才是真实开端监听了。

慢着,我赛, 接下来是个死循环啊, 啊对对,服务器端一向供给服务, 永不停歇。 可是这个accept是干嘛, 为什么运用了listenfd , 然后返回了一个新的connfd ???”

Bill满足的说: “不错,考虑就有前进, 可是你忘了我刚说的东西了, 服务器要区别隔各个客户端, 怎样区别呢? 那只有用一个新的socket来表明喽, 你看后面的操作都是根据connfd 来做的。 还有这个accept 适当于和客户端的connect 一同完成了TCP的三次握手 ! 至于之前的listenfd , 它只起到一个大门的作用了, 意思是说,欢迎敲门, 进门之后我将为你生成一个绝无仅有的socket描述符! ”

“有道理, 大神公然是大神, 考虑的十分全面啊, 不过好像有个缝隙,你一开端说socket指的是 (IP, Port), 现在你现已有了一个listenfd 的socket, 端口是80 然后每次客户端建议衔接还要创立新的connfd, 由于80端口现已被占用,莫非服务器端会为每个衔接都创立新的端口吗?”

"这是个好问题啊" Bill 说 “其实新创立的connfd 并没有运用新的端口号,也是用的80, 能够这么了解,这个socket描述符指向一个数据结构, 例如 listenfd 指向的结构是这样的:”

“而一旦accept 新的衔接, 新的connfd 就会生成, 像下面的表格, 就生成了两个connfd , 它们俩服务器端的ip和port都是想同的, 可是客户端的IP和Port是不同的, 天然就能够区别隔来了”

张大胖说:“唉, 这底层做了这么多作业啊, 看来socket 有必要得经过(客户端IP, 客户端Port, 服务器端IP, 服务器端Port) 来确认”

“其实这个四元组还不太精确, 由于我们说了半天,都是TCP协议的socket, 由于你们领导只需你完成这一个, 你看过UDP没有? 便是那个无衔接的运送层协议, 也有socket, 所以更精确的界说的话,还得加上协议这一项, 变成五元组(协议, 客户端IP, 客户端Port, 服务器端IP, 服务器端Port)

“大神,我们什么时分讲讲UDP的socket ? ”

"下次再说吧!"

题外话: 文中说到的Bill 是向 Bill Joy问候, 这是一个天才程序员,首要作业包含BSD Unix操作体系, 完成TCP/IP协议栈, vi 编辑器,c shell , NFC, SPARC处理器,jini等。

当年DARPA(美国国防部先进研讨项目局)和一个叫做BBN的公司签署了一个合同,要把TCP/IP协议参加到Berkeley Unix傍边, 当研讨生Bill Joy 看到BBN写的TCP/IP完成时, 觉得十分差劲,回绝把它参加内核, 后来爽性卷起袖子自己完成了一个高性能的TCP/IP栈, 这个协议栈至今是互联网的柱石。

他人问他是怎样完成这么杂乱的软件的, 这位大神说: “很简单啊, 你只需求看看协议, 然后把代码写出来就行了”

私我 1 拿走 干货