TCP/IP和Socket开发经验分享
当前与网络相关的业务主要是基于tcp/ip或http,熟悉j2ee的同学一定会对http场景下的开发比较了解。但是,精通tcp/ip以及如何构建一个直接基于tcp/ip层通讯的知识却不太多见。恰巧,最近一年来我参与了一些基于tcp/ip应用的开发工作。总算有所收获,今天在博客中做些分享,希望对有兴趣的同学有所帮助。
比较常见的4层网络模型(图)如下:

基于应用层的开发难度是相对比较低的,因为绝大部分与连接和数据传输、校验相关的事情已经交给(系统)来完成,使得开发人员只需要专注于业务即可。这种分层的技术结构是非常高级和有效的。基于应用层的开发虽然方便,但是当我们需要在功能上实现某些特殊需求的时候,就难免有些掣肘。例如,我们需要从一些传感器上采集数据或希望他们能够主动将数据上送,并在经过了中心系统处理后推送到其它响应装置。这样的需求使用http来开发,反而增大了难度。
操作系统实际已经为我们提供了一种基于传输层的通讯方式:套接字(socket)。使用套接字可以让我们自由定义通讯协议并选择合适的连接方式。
利用socket实现网络通信分为服务端和客户端,服务端绑定端口并主动监听连接,客户端需要向服务端发起连接。建立一次tcp连接需要进过“三次”握手:

第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
三次握手被抽象成socket连接,这个过程服务端和客户端会分别生成一个socket并通过在这个套接字上的连接收发数据。那么问题产生了,假如我们知道服务端对8081端口进行监听,客户端会随机打开一个高位端口进行连接。连接建立后,服务端是在哪个端口上监听数据的呢?答案是8081端口,服务端会根据端口上数据的源地址和端口判断从而将数据分发到正确的应用上去。
理解这一点其实很重要,如果此时通信的双方没有任何数据交换,socket也无法判断连接是否被断开。任意一方必须首先通知socket断开连接,整个通信过程才算结束。如果中间网络中断,连接会一直处于等待状态。
利用socket编程的另一个难点是,由于通信的双方完全对等任何一方都可以主动发送数据,如何实现在http应用中常见的请求/应答会比较麻烦。为此我专门查阅了http1.0和http1.1的相关资料,基本的解决方案总结如下:
- 客户端等待:客户端发送请求后,都需要进行堵塞并直到接收到应答或超时为止。这个是http1.0的协议规范,整个数据的交互方式是串行的。
 - 服务端等待:串行的运行方式实际上浪费了大量的系统运算时间,使得网络通讯很容易成为整个系统的瓶颈。于是http1.1协议做了更改,客户端只要准备好请求就可以直接发送,服务端可能会一次性接收到多条请求,但是只能按照请求的顺序依次应答。
 
服务器的运算能力通常都比客户端强,第二种解决方案能更加有效的利用网络。但是,如果有一条请求需要请求占用服务端大量的运算时间,后续应答都会被堵塞,因此在某些情况下也会引发比较严重的问题。
为了解决这个问题,我借鉴了spring kafka在实现消息交互的时候提供的一种解决思路:为每一条请求指定一个ID,经过服务端处理后的应答都需要带上这个ID。这样在回复给客户端的时候,客户端就可以根据这条ID值来调用不同的回调处理业务。
与tcp/ip开发的总结,大致如此。后面,我还会分享一些基于技术的实际项目,如果你对这些问题有兴趣,也欢迎给我留言讨论。
TCP/IP和Socket开发经验分享的更多相关文章
- TCP/IP以及Socket聊天室带类库源码分享
		
TCP/IP以及Socket聊天室带类库源码分享 最近遇到个设备,需要去和客户的软件做一个网络通信交互,一般的我们的上位机都是作为客户端来和设备通信的,这次要作为服务端来监听客户端,在这个背景下,我查 ...
 - Linux内核 TCP/IP、Socket参数调优
		
Linux内核 TCP/IP.Socket参数调优 2014-06-06 Harrison.... 阅 9611 转 165 转藏到我的图书馆 微信分享: Doc1: /proc/sy ...
 - ios开发网络知识 TCP,IP,HTTP,SOCKET区别和联系
		
TCP,IP,HTTP,SOCKET区别和联系 网络由下往上分为: 对应 物理层-- 数据链路层-- 网络层-- IP协议 传输层-- ...
 - TCP/IP、SOCKET、HTTP之间的联系与区别
		
主要内容: 1.网络的七层协议 2.TCP/IP.SOCKET.HTTP简介 3.TCP连接.HTTP连接.Socket连接的区别 一.网络的七层协议 网络七层由下往上分别为物理层.数据链路层.网络层 ...
 - 网络协议HTTP、TCP/IP、Socket
		
网络协议HTTP.TCP/IP.Socket 网络七层由下往上分别为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 其中物理层.数据链路层和网络层通常被称作媒体层,是网络工程师所研究的 ...
 - TCP/IP 和 Socket 的关系
		
要写网络程序就必须用Socket,这是程序员都知道的.而且,面试的时候,我们也会问对方会不会Socket编程?一般来说,很多人都会说,Socket编程基本就是listen,accept以及send,w ...
 - TCP/IP的Socket编程
		
1. TCP/IP.UDP的基本概念 TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,他是一个工业标准的协议集, ...
 - TCP,IP,HTTP,SOCKET区别和联系
		
物理层-- 数据链路层-- 传输层-- TCP协议 会话层-- 我 们在传输数据时,可以只使用(传输层)TCP/IP协议,但是那样的话,如 果没有应用层,便 ...
 - Mysql服务器相互作用的通讯协议包括TCP/IP,Socket,共享内存,命名管道
		
MySQL实现了四种通信协议 TCP/IP协议,通常我们通过来连接MySQL,各种主要编程语言都是根据这个协议实现了连接模块 Unix Socket协议,这个通常我们登入MySQL服务器中使用这个协议 ...
 
随机推荐
- Dubbo学习系列之八(分布式事务之MQ方案)
			
自从小王玩起了微服务,发现微服务果然很强大,好处真是太多,心中暗喜,然而,却也遇到了分布式中最棘手的问题:分布式事务.小王遍访各路神仙,也无个完美开源解决方案,当然,也有些实际可行的手法,虽不算完美, ...
 - volatile 关键字的作用
			
简介Java 语言提供了一种稍弱的同步机制,即 volatile 变量,用来确保将变量的更新操作通知到其他线程.volatile 变量具备两种特性:变量可见性.禁止重排序. 作为同步锁在访问 vola ...
 - 通过实例快速掌握k8s(Kubernetes)核心概念
			
容器技术是微服务技术的核心技术之一,并随着微服务的流行而迅速成为主流.Docker是容器技术的先驱和奠基者,它出现之后迅速占领市场,几乎成了容器的代名词.但它在开始的时候并没有很好地解决容器的集群问题 ...
 - .Net Core 商城微服务项目系列(十):使用SkyWalking构建调用链监控(2019-02-13 13:25)
			
SkyWalking的安装和简单使用已经在前面一篇介绍过了,本篇我们将在商城中添加SkyWalking构建调用链监控. 顺带一下怎么把ES设置为Windows服务,cd到ES的bin文件夹,运行ela ...
 - 痞子衡嵌入式:史上最强i.MX RT学习资源汇总(持续更新中...)
			
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MX RT学习资源. 类别 资源 简介 官方汇总 i.MXRT产品主页 恩智浦官方i.MXRT产品主页,最权威的资料都在这里,参考手 ...
 - Postgressql高可用(pgpool+异步流复制)
			
文档结构: 由于博主之前是Oracle dba,oracle 高可用一般是rac,以及搭建ADG,一个是基于实例的高可用,一个是基于数据的容灾,甚至也有rac+adg的方式.Postgres有同步和异 ...
 - apache中通过mod_rewrite实现伪静态页面的方法
			
rewrite规则学习 我们新建一个.htaccess文件之后,就在里面写入以下内容: RewriteEngine on #rewriteengine为重写引擎开关on为开启off为关闭 Rewrit ...
 - 校园网 虚拟机VMware Linux桥接模式 无法上网 问题
			
只是解决常见虚拟机桥接模式 无法上网问题,基本的百度都有 基本知识 虚拟机有三种网络连接模式:桥接模式,net模式,仅主机 桥接模式:同一网段允许的话,相当于一个独立的物理主机,独立ip net模式: ...
 - Android中Project、Module的区别
			
Project 可以包含多含 Module. Project相当于eclipse里面的工作区间,module相当于其project.module可以作为狭义上的模块,可以多个app共用的module. ...
 - git远程分支不显示问题解决
			
因为项目太大,然后直接git clone拉不下来代码 会报error: RPC failed; HTTP 504 curl 22 The requested URL returned error: 5 ...