您当前的位置:首页 > 电脑百科 > 网络技术 > 网络技术

TCP/IP和Socket开发经验分享

时间:2019-11-04 10:28:40  来源:  作者:

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

比较常见的4层网络模型(图)如下:

TCP/IP和Socket开发经验分享

 

基于应用层的开发难度是相对比较低的,因为绝大部分与连接和数据传输、校验相关的事情已经交给(系统)来完成,使得开发人员只需要专注于业务即可。这种分层的技术结构是非常高级和有效的。基于应用层的开发虽然方便,但是当我们需要在功能上实现某些特殊需求的时候,就难免有些掣肘。例如,我们需要从一些传感器上采集数据或希望他们能够主动将数据上送,并在经过了中心系统处理后推送到其它响应装置。这样的需求使用http来开发,反而增大了难度。

操作系统实际已经为我们提供了一种基于传输层的通讯方式:套接字(socket)。使用套接字可以让我们自由定义通讯协议并选择合适的连接方式。

利用socket实现网络通信分为服务端和客户端,服务端绑定端口并主动监听连接,客户端需要向服务端发起连接。建立一次tcp连接需要进过“三次”握手:

TCP/IP和Socket开发经验分享

 

第一次握手:客户端发送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的相关资料,基本的解决方案总结如下:

  1. 客户端等待:客户端发送请求后,都需要进行堵塞并直到接收到应答或超时为止。这个是http1.0的协议规范,整个数据的交互方式是串行的。
  2. 服务端等待:串行的运行方式实际上浪费了大量的系统运算时间,使得网络通讯很容易成为整个系统的瓶颈。于是http1.1协议做了更改,客户端只要准备好请求就可以直接发送,服务端可能会一次性接收到多条请求,但是只能按照请求的顺序依次应答。

服务器的运算能力通常都比客户端强,第二种解决方案能更加有效的利用网络。但是,如果有一条请求需要请求占用服务端大量的运算时间,后续应答都会被堵塞,因此在某些情况下也会引发比较严重的问题。

为了解决这个问题,我借鉴了spring kafka在实现消息交互的时候提供的一种解决思路:为每一条请求指定一个ID,经过服务端处理后的应答都需要带上这个ID。这样在回复给客户端的时候,客户端就可以根据这条ID值来调用不同的回调处理业务。



Tags:TCP/IP   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除,谢谢。
▌相关推荐
从字面意义上讲,有人可能会认为 TCP/IP 是指 TCP 和 IP 两种协议。实际生活当中有时也确实就是指这两种协议。然而在很多情况下,它只是利用 IP 进行通信时所必须用到的协议群...【详细内容】
2021-07-14  Tags: TCP/IP  点击:(2)  评论:(0)  加入收藏
TCP/IP是网络最基本的通信协议,任何厂家生产的计算机系统,只要遵守该协议,就能与因特网互联互通。但是,TCP/IP存在的一些缺陷,常常被不法分子利用,成为他们发动攻击的一种手段。20...【详细内容】
2021-04-13  Tags: TCP/IP  点击:(84)  评论:(0)  加入收藏
要说我们接触计算机网络最多的协议,那势必离不开 TCP/IP 协议了,TCP/IP 协议同时也是互联网中最为著名的协议,下面我们就来一起聊一下 TCP/IP 协议。...【详细内容】
2021-04-01  Tags: TCP/IP  点击:(65)  评论:(0)  加入收藏
前言TCP/IP 协议是网络通信的基石,TCP/IP协议不是只有 TCP 和 IP 协议,它是整个网络通信中所有协议的简称。维基百科:TCP/IP协议簇维基百科:OSI模型# TCP/IP 参考模型维基百科ht...【详细内容】
2021-03-25  Tags: TCP/IP  点击:(85)  评论:(0)  加入收藏
对于软件公司来说,IoT 模式为其硬件设计以及所提供的服务带来决定性的改变。其中影响最大的一个方面是通信协议。通信协议可以被认为是一种语言,即两台或两台以上的设备可以相...【详细内容】
2020-12-30  Tags: TCP/IP  点击:(81)  评论:(0)  加入收藏
前言 计算机网络是一门基础课程,但是老师所讲的东西无非起到一个抛砖引玉的作用。然而对于需要自学的人来说,无疑是更难的。前路漫漫~~ 计算机网络本来就是比较枯燥的,文章内容较...【详细内容】
2020-10-30  Tags: TCP/IP  点击:(41)  评论:(0)  加入收藏
报告编号:B6-2020-101901报告来源:360-CERT报告作者:360-CERT更新日期:2020-10-190x01 前言1.1 环境搭建(1)攻击机环境:Ubuntu 20.04安装scapysudo apt install python-pip3sudo p...【详细内容】
2020-10-21  Tags: TCP/IP  点击:(89)  评论:(0)  加入收藏
IPV4协议提供简单服务,实现从源地址到目的地址的数据转发!(不建立连接,不保证数据传输的可靠性)数据报格式(首部+数据): 首部的长度以4字节为单位,长度范围20-60字节,具体跟首部...【详细内容】
2020-10-16  Tags: TCP/IP  点击:(87)  评论:(0)  加入收藏
网络层是为主机之间提供逻辑通信,而运输层为应用进程之间(socket:ip+端口)提供端到端的逻辑通信。端口 服务器使用的端口系统端口号/熟知端口号 (0-1023)FTP: 21TELNET: 23SMPT:...【详细内容】
2020-09-02  Tags: TCP/IP  点击:(63)  评论:(0)  加入收藏
TCP/IP 协议作为现代网络的骨架,其在现代生活中的重要性不言而喻。 不同的计算机厂家使用不同的硬件,生产出的不同型号的计算机,搭载不同的操作系统,通过tcp/ip协议可以进行通讯...【详细内容】
2020-08-10  Tags: TCP/IP  点击:(32)  评论:(0)  加入收藏
▌简易百科推荐
在目前工业4.0的背景下,企业需要一套可以远程调试设备的系统,利用物联网技术,通过结合PLC设备将设备的信息进行采集、收集,控制。利用PLC设备将设备的数据进行远程采集显示到云...【详细内容】
2021-07-14  博达智联    Tags:虚拟串口   点击:(2)  评论:(0)  加入收藏
DNS 过程,步骤如下:查看浏览器内部缓存 检测域名是否存在于浏览器缓存中,如果有缓存直接使用,没有则下一步。打开chrome://net-internals/#dns 即可查看本机浏览器的 DNS 缓存。...【详细内容】
2021-07-09  尚硅谷教育    Tags:IP 地址   点击:(7)  评论:(0)  加入收藏
前段时间刚部署好了eNSP,紧接着又看了VXLAN的文档,现在我们大概已经知道VXLAN隧道的建立方式分为手工创建和自动创建,放在华为设备上,配置方式可以分为静态方式和EVPN的方式。那...【详细内容】
2021-07-06  衡水铁头哥    Tags:VXLAN   点击:(17)  评论:(0)  加入收藏
动态NAT能解决内网电脑上网问题,但是内网有很多用户同时访问外网,就不能解决这个问题了。 NAPT(Network Address and Port Translation,网络地址端口转换)技术可以解决这个问...【详细内容】
2021-07-05  工科男的深邃    Tags:公网地址   点击:(10)  评论:(0)  加入收藏
我是一个 Linux 服务器上的进程,名叫小进。老是有人说我最多只能创建 65535 个 TCP 连接。我不信这个邪,今天我要亲自去实践一下。我走到操作系统老大的跟前,说:"老操,我要建立一...【详细内容】
2021-07-04  低并发编程  今日头条  Tags:TCP 连接   点击:(18)  评论:(0)  加入收藏
整体规划采用三层网络结构,核心、汇聚三层互联,堆叠采用40G网络,汇聚10G,接入1G,网关下放到汇聚,交换机采用独立管理VLAN,模拟某工厂真实网络情况。功能实现1、核心、汇聚堆叠,动态...【详细内容】
2021-06-28  王忘杰  今日头条  Tags:网络   点击:(10)  评论:(0)  加入收藏
前言当遇到 Java 线上问题时,如 CPU 飙升、负载突高、内存溢出等问题,你需要查命令,查网络,然后 jps、jstack、jmap、jhat、jstat、hprof 等一通操作。而除了这些,Arthas 是一款...【详细内容】
2021-06-25  胡言胡语的笔记    Tags:Arthas   点击:(12)  评论:(0)  加入收藏
如果 ESXi 主机对 LUN 生成的命令超过 LUN 队列深度所允许的数量,则超出的命令会在 VMkernel 中排队。这会增加滞后时间,或是完成 I/O 请求所需的时间。问题主机完成 I/O 请求...【详细内容】
2021-06-23  网络管理员老高  今日头条  Tags:I/O   点击:(19)  评论:(0)  加入收藏
下面是一个简单的echo服务程序:#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <unistd.h>#include...【详细内容】
2021-06-21  追光的Rocky    Tags:exec命令   点击:(20)  评论:(0)  加入收藏
钉钉美图前言最近有一个小需求【调试远程python代码,超方便pycharm教程】需要用到内网穿透,然后自己搜到了【最强内网穿透工具frp】。然后看网友评论里面有推荐【傻瓜式-Web面...【详细内容】
2021-06-18  瞥瞥张  今日头条  Tags:内网穿透   点击:(57)  评论:(0)  加入收藏
相关文章
    无相关信息
最新更新
栏目热门
栏目头条