socket编程之基础学习

在面试中如果你说你会网络编程,那么面试官肯定会问你socket编程相关的问题。比如让你写一个基于TCP或UDP的socket编程的C/S模型,让你解释socket存在于哪里,更深入一点的还会问你accept()函数返回发生在什么时候(TCP三次握手建立连接之后)等等。有的也会直接在笔试中出现,总之理解掌握socket编程的流程和内部的基本原理无论对于我们实际的项目开发和面试都是很有必要的。在linux下和windows下的socket编程,其接口基本上是相同的。所以学会了其中的一种,那么在另一平台上的socket编程也就大同小异了。关于socket的讲解在网上可以找到许多精彩的博文,它们讲的通俗易懂又不失深度,我就不再赘述。

下面给出我认为讲的还可以的2篇博文的链接地址:

揭开Socket编程的面纱   http://goodcandle.cnblogs.com/archive/2005/12/10/294652.aspx

Linux Socket编程(不限Linux)http://www.cnblogs.com/skynet/archive/2010/12/12/1903949.html

我认为如果你不能说明白socket存在于哪里,那么你也就不可能对socket有和网络的基本知识有一个很深刻的理解。在学习中我们要有这种追根溯源的精神,不仅要知道怎么用,还要知道为什么这样用,要明白底层的原理。如果我们在平时学一项技术时能做到这些,那么在我们面试求职时面对面试官的一些问题也会显得游刃有余了。好了,又废话了!!

那么socket究竟存在于哪里了,请允许我使用上面给出的博文中的一些图示


上图清楚的显示了TCP/IP协议族包含的4层结构(应用层,运输船,网络层,链路层)和socket在TCP/IP协议族4层结构模型中存在的位置。实际上socket就是系统提供给我们的一系列API接口。通过这些接口,我们可以调用系统核心提供给我们的网络服务。我们不用去操心网络底层的复杂结构,一系列相关的socket接口封装了系统中网络部分的复杂细节,是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。这样我们程序员在编程时就不用去操心网络结构下3层的具体细节和实现了,我们可以把精力更多的放到我们应用层进程的设计中,当网络的下3层的具体细节发生变化时,只要系统提供给我们的socket接口没有变化,我们就不需要修改先前的程序使其可以在新的网络上正常的运行。

由此我们还可以思考一下为什么会有网络体系结构的这4层结构模型呢?

首先,第一个问题,运输层的作用是什么?我们为什么要设置运输层?

要想搞清楚这个问题,我们还需要搞清楚设置网络层的意义

我们都知道网络层在网络中主要是提供物理上的连接,其核心的部件就是路由器。我们之所以能通过IP地址就可以与另一台连接在网络上的主机通信就是通过路由器帮助我们寻址的。我们还需注意到的一点是在网络中对应的网络层的数据报文其首部的源主机IP地址和目的主机IP地址是不变的,而我们的数据在网络层是要通过不止一个路由器的。这便是ARP地址解析协议发挥作用的时刻了,在网络层的数交付给链路层时,ARP地址解析协议会解析出路由器下一跳目的路由器的物理地址,正是通过这样的过程我们才找到目的主机的。实际上IP地址只是一个逻辑上的地址,我们要把数据发送到目的主机还是依赖于唯一的物理地址。IP地址是我们为了省去直接使用物理地址所带来的麻烦,那么我们使用域名则是为了省去使用IP地址所带来的麻烦。

我们之所以要设置一个网络层也是出于网络管理的方便,应为在网络的底层架构上不仅是有线网络,还有无线网络,基于卫星传递信息的网络等等结构相异且异常复杂的网络结构。而有了网络层以后我们就不必关心网络的异构问题,把数据在异构网络上的传递交付给路由器来管理。

但是我们需要注意的是网络曾提供的数据交付是不可靠的,它只是尽最大努力交付,并把数据报文是分组发送的,上层交付下来的数据报文可能要分成多个分组,通过不同的路由器路径发送到目的主机,然后目的主机再把数据分组合并成完整的数据报提交给网络的上一层进行处理。网络层并不保证数据完整正确,因为在数据的传输过程中可能出现这样那样的问题,数据分组也可能丢失。

既然网络层不能提供数据的可靠交付,我们就需要一个保证数据可靠交付的新的网络体系层次。这便是运输层,它便是提供数据的可靠交付而设置。具体的实现上TCP(Transmission Control Protocol)即传输控制协议)协议通过超时重传机制和滑动窗口来保证数据的可靠交付。而UDPUser Data Protocol,用户数据报协议)协议

说实话不能提供可靠地交付,我们在使用基于UDP协议的套接字编程时需要在应用层上保证数据的可靠交付。

TCP的可靠交付是建立在3次握手建立连接的基础上的,这个过程类似与我们打电话的过程。正是由于需要建立连接,所以TCP协议的开销比UDP协议的大,但它能够提供可靠地数据连接,因此适用于应用层协议FTP协议和HTTP协议的实现。而UDP协议不需要建立连接的过程,类似于我们发短信的过程,因此其方便灵活,开销小,适用于IP电话,电话电视会议的应用。

关于TCP三次握手的过程也是面试中常常被问到的问题,下面的这篇博文感觉讲TCP三次握手建立连接和四次握手释放连接的过程还可以,对于为什么会有3次握手而不是2次握手建立连接也有详细的论述。

推荐如下: TCP三次握手详解及释放连接过程     http://blog.csdn.net/oney139/article/details/8103223

扯了半天,貌似和socket编程没有半毛钱的关系,但上面扯的那些原理性的东西才是真真正正的精华所在。本人最笨,扯的不是很清楚,也不是很详细,如果想要清楚深入的了解计算机网络的知识还是好好的找本计算机网络基础的书好好的看看。其实有些大公司招聘应届生看的不是你的项目,当然如果项目够出彩,够有技术含量,用人单位还是很重视的。如果你没有好的项目经验,那还是好好的掌握基础知识吧!

为了方便阅读,下面给出    Linux Socket编程(不限Linux)http://www.cnblogs.com/skynet/archive/2010/12/12/1903949.html  这篇博文中的精彩部分:


限于自己知识水平有限,对知识的理解程度有限,文章写的不甚详细。写博客不仅是对自己知识的梳理和总结,也是想要为开放的网络平台奉献更多有价值的东西,希望我的整理对你是有帮助的。让我们共同努力提高自己。

在路上,我会一直努力的,努力的提高自己,写出真正有价值有技术含量的文章。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值