TCP通信的两方,其中一方正常关闭(调用close函数或程序正常退出)正处于连接状态的TCP套接字,这时双方的TCP将完成协商关闭连接的四次握手,握手结束以后,另一方的应用层将检测到TCP连接对应的套接字可读,执行read函数的时候倘若返回0,则说明对方已经主动断开了TCP连接,这边只需要调用close函数关闭对应套接字,回收相关资源即可。整个过程就是正常网络连接断开的处理过程。 阅读全文
我们在编写网络通信程序的时候,不论作为服务端还是客户端,常常需要确保实时检测与对方的连接状态,调用select函数监控文件描述符(套接字)的连接状态是最普遍的方法,但是当遇到对方断电或者网络线路突然断开的情况,select函数将接收不到来自对方的断开消息,所以维护着这一连接的文件描述符(套接字)已经没有存在的意义,这个时候往该文件描述符(套接字)内写内容依然不会返回错误,read也会堵塞着并不返回错误。因此也无法断定该套接字是否还处于连接状态,我们可以通过开启TCP的keepAlive选项来让TCP连接自身维护自己的连接状态,详见《Linux下回收异常断开的TCP连接》,但是倘若要及时检测网络连通性,不得不频繁地发心跳包,势必会影响通信带宽,不是很理想。 阅读全文
一、SSL基本原理
加密和解密使用同一个密钥的算法,称为对称加密算法;加密和解密使用不同密钥的算法,称为非对称加密算法。
对称加密算法通信双方都需要密钥,此密钥一旦被第三方窃取,通信过程将毫无隐私可言。 阅读全文
简易版SSL加密聊天程序分为服务端跟客服端,主要实现简易的加密聊天功能。服务端支持同时与多个客服端保持通信(连接),采用OpenSSL开源库实现加密功能,依赖客户端主动发起连接与对话方能回复客户端,能够检测到某个客户端断开连接。客户端指定IP与端口与服务端建立连接,需要主动发起对话方能等待服务端的回复。需要用到源文件有sslServer.c、sslClient、api.c和ssl.h,同时我们还需要利用openssl命令生成私有密钥文件privkey.pem以及证书(公有密钥)文件cacert.pem。 阅读全文
OpenSSL的API使用起来与我们常用的普通网络通信函数大同小异,主要分为初始化阶段、密钥载入及验证阶段、创建SSL(类似于文件描述符(套结字)创建函数socket)阶段、绑定套结字阶段(类似于bind函数)、请求建立连接阶段(客户端特有,类似于connect)、接受连接请求阶段(服务端特有,类似于accept函数)、数据收发阶段(类似于read和write)、结束连接阶段以及结束监听阶段(类似于close)。为了让SSL通信过程更加清晰明了,故自己用C语言封装了5个主要函数,让SSL通信流程为开发者快速掌握、一目了然。
阅读全文
普通的TCP通信无法保证数据的安全,它随时可能被第三方截获而泄漏通信双方之间的隐私,这显然是我们不希望看到的,尤其在跟用户名、密码、个人信息息息相关的通信过程(如网上银行交易、机密文件传输等等)尤其看重数据交互的隐秘性,所以我们常常用SSL协议来建立安全保密的通信,SSL协议能够保证交互双方的数据按密文方式传输,第三方在没有私钥的情况下几乎无法破解,从而到达保密的目的。究竟SSL是如何交互数据来确保安全的,很多人却不得而知,为了解答大家的疑惑,这里详细介绍一下SSL的交互过程。 阅读全文