滴滴滴滴!!!!!
学习帮助文章:【 Socket、TCP/IP协议、UDP协议(学习链接地址:https://www.cnblogs.com/xiaowenshu/p/9916755.html)。UDP&TCP协议相关学习链接地址:https://www.cnblogs.com/ywzbky/p/10731808.html】
- TCP【传输控制协议】的作用(tcp属于运输层):用来传输客户端与服务器数据报文,前提需要先建立tcp连接,tcp连接需要经过三次握手,断开连接时需要经过四次挥手。(这个连接会一直保持活动状态,知道超时、或客户端主动断开连接)TCP有长连接和短连接。短连接的优点,管理起来简单,存在的连接都是有用的连接。
-
【长连接:连接=》传输数据=》保持连接=》传输数据=》。。。。。。=》关闭连接】
-
【短连接:连接=》传输数据=》关闭连接】
- IP协议属于网络层, IP协议主要解决网络路由和寻址问题 。
- 首先简单介绍socket,它起源于unix,而unix/Linux基本哲学之一就是“一切皆文件对于文件的操作就是【打开】【读写】【关闭】 模式操作,socket就是该模式的一个实现,socket是一中特殊的文件。”Socket协议和http协议都属于应用层,socket套接字相当于是一组接口,socket连接建立之后不管是否使用都一直保持连接。
- UDP【用户数据报协议】,面向无连接的,简单不可靠的传输层协议。
扩展:HTTP协议与TCP/IP协议的关系**
HTTP的长连接和短连接本质上是TCP长连接和短连接。HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议。IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠的传递数据包,使在网络上的另一端收到发端发出的所有包,并且顺序与发出顺序一致。TCP有可靠,面向连接的特点。****HTTP长连接和短连接的详细介绍连接:https://www.cnblogs.com/0201zcr/p/4694945.html
异步socket&同步socket:
【异步socket&同步socket】学习帮助文档链接地址:https://blog.csdn.net/u011555996/article/details/93378498
阻塞模式socket(当使用socket创建套接字,默认的套接字是阻塞模式。意思是当调用windows sockets API时不能立即返回,线程处于一直等待状态,直到操作完成。)
异步非阻塞模式又被称为长连接,相反,同步阻塞模式又被称为短连接。举个例子讲同步阻塞模式,假如需要测验100名学生400米成绩,如果你每次让一个学生起跑并等他回到终点你记下成绩然后让下一位学生起跑,知道所有学生跑完。那么现在你就掌握了同步阻塞模式,哈哈哈。在假如你换了一个方案,你一边每隔10秒让一位学生起跑,直达所有学生起跑完毕。另一边每有一个学生抵达终点就记录成绩,直到所有学生都跑完,现在恭喜你已经掌握异步非阻塞模式。这时你又想到一个方案,你带了很多怀表,让学生分组互相测验。现在的你已经学会了多线程同步模式。是不是效率大大提高了很多呢。(帮助文档连接https://blog.csdn.net/originpoint/article/details/84993476)
c#高性能大容量SOCKET并发
c#高性能大容量SOCKET并发(粘包、分包、解包。解读文章链接地址:https://blog.csdn.net/SQLDebug_Fan/article/details/20465455)
归纳:
socket(应用层)<< tcp/udp(传输层)<< IP(网络层)
A、http协议也就是超文本传输协议,是web联网的基础,也是手机联网常用协议之一,http协议是建立在tcp协议之上的一种应用。
HTTP连接最显著的特点就是每次客户端发送请求时都需要服务端会送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接到过程称为"一次连接”。
http 1.0,客户端的每次请求都要求建立一次单独的连接,在处理完本次请求后,就自动释放连接。
http 1.1,可以在一次连接中处理多个请求,且多个请求可以叠加进行,不需要等待请求结束后再发送下一个请求。
B、socket连接: 建立Socket连接至少需要一对套接字,其中一个运行在客户端,称为ClientSocket,另外一个运行在服务端,称为ServerSocket。
套接字之间的过程分为:服务器监听、客户端请求、连接确认。
1、服务器监听:服务端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。
2、客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务端的套接字。为此,客户端首先要描述他套连接的套接字,指出服务端的套接字的地址和端口号,然后就向服务端套接字提出连接请求。
3、连接确认:当服务端监听到或接收到客户端发送到套接字连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务端的套接字发送给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务端套接字处于肩痛状态,继续接受其他客户端套接字的连接请求。
HTTP协议与socket之间形象化描述:http就是轿车,提供了封装或显示数据的具体形式。socket就是发动机,提供了网络通信的能力。
TCP连接带来的粘包问题以及UDP为什么不会产生粘包问题(引起粘包原因、解决措施)
什么粘包???
TCP粘包就是指发送方发送的若干数据到达接收方粘成一包,从接受缓冲区来看,后一数据包的包头紧接着前一数据包的包尾。
2.Q:造成TCP粘包的原因
(1)发送方原因
TCP默认使用Nagle算法(主要作用:减少网络中报文段的数量),而Nagle算法主要做两件事:
只有上一个分组得到确认,才会发送下一个分组
收集多个小分组,在一个确认到来时一起发送
Nagle算法造成了发送方可能会出现粘包问题
(2)接收方原因
TCP接收到数据包时,并不会马上交到应用层进行处理,或者说应用层并不会立即处理。实际上,TCP将接收到的数据包保存在接收缓存里,然后应用程序主动从缓存读取收到的分组。这样一来,如果TCP接收数据包到缓存的速度大于应用程序从缓存中读取数据包的速度,多个包就会被缓存,应用程序就有可能读取到多个首尾相接粘到一起的包。
(3)解决措施:应用层的解决办法简单可行,不仅能解决接收方的粘包问题,还可以解决发送方的粘包问题。
解决办法:循环处理,应用程序从接收缓存中读取分组时,读完一条数据,就应该循环读取下一条数据,直到所有数据都被处理完成,但是如何判断每条数据的长度呢?
格式化数据:每条数据有固定的格式(开始符,结束符),这种方法简单易行,但是选择开始符和结束符时一定要确保每条数据的内部不包含开始符和结束符。
发送长度:发送每条数据时,将数据的长度一并发送,例如规定数据的前4位是数据的长度,应用层在处理时可以根据长度来判断每个分组的开始和结束位置。
UDP连接就不会产生粘包问题,这是因为TCP为了保证可靠传输并减少额外的开销,采用了基于流的传输,基于流的传输不认为消息是一条一条的,是无保护消息边界的。(保护消息边界:只传输协议吧数据当做一条独立的消息在网上传输,接受端一次只能接受一条独立的消息)。UDP是面向传输的,是有保护消息边界的,接收方一次只能接收一条独立的消息,所以不存在粘包问题。
tcp粘包,分包解决策略归纳
- 消息定长,比如100字节。
- 在包尾部增加回车或空格符等特殊字符进行分割,典型的ftp协议。
- 将消息分为消息头,消息尾。
- 其他复杂的协议,如RTMP协议等。