代码改变世界

Socket网络编程

2013-04-29 09:27 onm 阅读(...) 评论(...) 编辑 收藏

本文主要简介TCP、UDP协议和Socket编程模型。

做网络编程肯定要和TCP或者UDP协议打交道,有时候我们可能用过相应封装好的类,却不一定知道底层的实现。TCP或者UDP详细讲起来可以讲两本书,有一套很有名的书《TCP/IP详解》,内容很丰富,介绍了方方面面。本文以介绍TCP为主,主要介绍TCP建立连接和连接关闭的步骤。次要提及一些相关知识。

先说最基本的TCP与UDP一个最大区别是,TCP是面向连接的,而UDP不是。进而TCP是可靠的,当然还有其它一些机制保障,UDP是不可靠的。也显然TCP因要建立连接,所以更加消耗资源,速度也会较UDP慢。各有优缺点。大名鼎鼎的HTTP协议是建立在TCP之上的,还有很多也是在TCP之上。当然UDP也有很多它的使用场景。

因TCP比UDP复杂,所以一个TCP包的头占用的字节显然会比UDP多。下图分别是UDP和TCP的包结构。

接下来介绍一下TCP建立连接和关闭连接的过程。(http://robinjie.iteye.com/blog/289843)

首先是建立连接,建立链接俗称三次握手。

第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

然后是关闭连接,也可以称为四次挥手。

1.任何一方都可以主动终止一个连接。主动断开的一方发送FIN。

2.当被动关闭的一方收到FIN报文时,它会发送ACK确认报文。

3.被动关闭在应用层准备关闭的时候,发送FIN报文。(有时候,被动关闭端会将ACK和FIN两个报文合在一起发送。)

4.主动关闭端收到FIN后发送ACK,然后连接关闭。

整个流程还是较为复杂的,有的时候我们可能需要知道一些TCP连接当前是什么状态,可以通过netstat命令来查看,这个命令会显示TCP连接当前状态,很是好用。

 

下半部分是Socket编程的介绍。Socket编程是建立在TCP或者UDP协议上的,发送的数据包就是TCP或者UDP的包。纯粹的网络的编程是使用Socket技术的。比如可以使用Socket来编写服务器软件。

关于Socket网络编程的模型,我在网上找到了两张图片,较好的说明了编程的流程。图片如下,分别是UDP编程流程,TCP编程流程:

 

 

Socket编程的过程中涉及到一些参数,比如SO_RCVBUF,SO_SNDBUF表示接收和发送的缓冲区大小。