TCP编程流程和粘包

这篇具有很好参考价值的文章主要介绍了TCP编程流程和粘包。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1、TCP编程流程

 2、粘包


1、TCP编程流程

TCP编程流程和粘包,tcp/ip,网络协议

 

socket() 是创建套接字,返回值为监听套接字描述符,有了套接字才能通过网络进行数据的传输。创建套接字的参数要指定服务类型,TCP协议使用的是流式服务(SOCK_STREAM)。

bind() 是指定套接字使用的IP和端口。IP地址 是自己主机的地址。端口 是一个16位整型值, 一般0~1024为知名端口,一般用户不能随便使用;1024~4096为保留端口,一般不使用;4096以上为临时端口,可以使用。在Linux系统上,1024以内的端口号只有root用户可以使用。

listen() 是创建监听队列。监听队列有两种,一个是存放未完成三次握手的连接,一种是存放已完成三次握手的连接。该函数的第二个参数在Linux系统上是指已完成三次握手队列的长度,在Unix系统上是未完成和已完成三次握手队列总和的大小。

accept() 是处理放在 listen() 创建的已完成三次握手队列中的连接。每处理一个连接,accept()返回一个该连接对应的连接套接字描述符,如果已完成三次握手队列为空,则accept阻塞。

TCP编程流程和粘包,tcp/ip,网络协议

 

connect() 一般由客户端程序执行,需要指定连接的服务端的IP和端口。该方法执行后,会进行三次握手,建立连接

三次握手(建立连接)

TCP编程流程和粘包,tcp/ip,网络协议

send() 是用来向TCP连接的对端发送数据。send()执行成功,说明成功将数据写入发送端的发送缓冲区中,并不能说明已经发到对端。返回值为实际写入发送缓冲区的数据长度。

recv() 是用来接收TCP连接的对端发送的数据。recv()从自己的接收缓冲区中读取数据,如果接收缓冲区中没有数据,就会阻塞。返回值为实际读取的字节数。

recv()返回值为0是对端关闭TCP连接的唯一标识。

close() 可用来关闭文件的,该处用于关闭套接字和TCP连接。

关闭TCP链接:自己端执行该方法后,在对端未执行close()时,进行两次挥手,此时处于半连接状态;当对端也执行close()后,再进行后两次挥手,最终完成四次挥手。

四次挥手(断开连接)

TCP编程流程和粘包,tcp/ip,网络协议

 2、粘包

对6.2服务端代码中的recv()函数的参数从127改为1,即一次recv一个字符。

客户端发送一个 "hello" ,服务端将会把hello每个字符换行打印一次,客户端收到一个 "ok" ;当客户端再发送数据后,将会收到四个 "ok" 。如下图:

 TCP编程流程和粘包,tcp/ip,网络协议

TCP编程流程和粘包,tcp/ip,网络协议

 

原因:首先明确程序的循环运行速度要小于服务端将数据从其发送缓冲区传递到客户端的接收缓冲区。recv()和send()都是从接收缓冲区和发送缓冲区中读取数据,并不意味着把数据发给对方或者从对方处接收到数据。

当服务端recv()第一个字符 ‘h’ 后,此时客户端的recv()正处于阻塞状态(客户端的接收缓冲区为空),send()一个 "ok" 到发送缓冲区并传递给客户端的接收缓冲区,还没等到服务端recv()第二个字符 ‘e’ 后send()第二个 "ok" ,客户端就已经recv()了其接收缓冲区中的 “ok” ,此时客户端的接收缓冲区只有一个 “ok” 。客户端recv()后阻塞在fgets()函数处,等待输入数据。等待过程中,服务端也已经将剩下的四个字符对应的四个 "ok" 陆陆续续发送到客户端的接收缓冲区中,当客户端刚recv()第二个数据后,就会立即读取接收缓冲区中的四个 "ok" ,将其打印出来。

查看缓冲区的数据字节大小命令:netstat -natp

 TCP编程流程和粘包,tcp/ip,网络协议

 

出现这种数据粘连在一起无法区分第几次发送的情况即为粘包

粘包的概念:TCP粘包就是指发送方发送的若干包数据到达接收方时粘成了一包

产生粘包的原因:

1、TCP是基于字节流的,虽然应用层和传输层之间的数据交互是大小不等的数据块,但是TCP把这些数据块仅仅看成一连串无结构的字节流,没有边界; 2、在TCP的首部没有表示数据长度的字段,基于上面两点,在使用TCP传输数据时,才有粘包或者拆包现象发生的可能。

粘包/拆包发生的原因:

发生TCP粘包或拆包有很多原因,现列出常见的几点: 1、要发送的数据大于TCP发送缓冲区剩余空间大小,将会发生拆包。 2、待发送数据大于MSS(最大报文长度),TCP在传输前将进行拆包。 3、要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包。 4、接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包。

TCP 字节流的特点:发送端执行的写操作次数和接收端执行的读操作次数之间没有任何数量关系,应用程序对数据的发送和接收是没有边界限制的。

TCP编程流程和粘包,tcp/ip,网络协议

 

粘包对于数据下载没有影响,只需要将数据全部收到就可以;而在交互时需要发送次数与接收次数对应。

粘包的简单解决办法:

1、发送端给每个数据包添加包首部,首部中应该至少包含数据包的长度,这样接收端在接收到数据后,通过读取包首部的长度字段,便知道每一个数据包的实际长度了。

2、在数据前后加上标志,对方接收到数据后进行检查数据是否完整。3、发送端将每个数据包封装为固定长度(不够的可以通过补0填充),这样接收端每次从接收缓冲区中读取固定长度的数据就自然而然的把每个数据包拆分开来。文章来源地址https://www.toymoban.com/news/detail-568663.html

到了这里,关于TCP编程流程和粘包的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【网络编程】网络通信基础——简述TCP/IP协议

    个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【网络编程】【Java系列】 本专栏旨在分享学习网络编程的一点学习心得,欢迎大家在评论区交流讨论💌 ip地址简单来说就是用来描述网络上一个设备的所在位置。 端

    2024年02月04日
    浏览(42)
  • 网络编程——深入理解TCP/IP协议——OSI模型和TCP/IP模型:构建网络通信的基石

    TCP/IP协议,即 传输控制协议/互联网协议 ,是一组用于在计算机网络中实现通信的协议。它由两个主要的协议组成:TCP(传输控制协议)和IP(互联网协议)。TCP负责确保数据的可靠传输,而IP则负责路由数据包以在网络中传递。TCP/IP协议簇还包含其他辅助协议,如UDP(用户数

    2024年02月14日
    浏览(43)
  • Socket TCP/IP协议数据传输过程中的粘包和分包问题

    一:通过图解法来描述一下分包和粘包,这样客户更清晰直观的了解: 下面对上面的图进行解释: 1.正常情况:如果Socket Client 发送的数据包,在Socket Server端也是一个一个完整接收的,那个就不会出现粘包和分包情况,数据正常读取。 2.粘包情况:Socket Client发送的数据包,

    2024年02月12日
    浏览(33)
  • 【网络编程】TCP/IP协议(互联网的基石)

    (꒪ꇴ꒪ ),Hello我是 祐言QAQ 我的博客主页:C/C++语言,数据结构,Linux基础,ARM开发板,网络编程等领域UP🌍 快上🚘,一起学习,让我们成为一个强大的攻城狮! 送给自己和读者的一句鸡汤🤔: 集中起来的意志可以击穿顽石! 作者水平很有限,如果发现错误,请在评论区指

    2024年02月10日
    浏览(33)
  • Linux 网络编程学习笔记——一、TCP/IP 协议族

    数据链路层实现了网卡接口的网络驱动程序,以处理数据在物理媒介(以太网、令牌环等)上的传输,不同的物理网络具有不同的电气特性,网络驱动程序隐藏了这些细节,为上层协议提供一个统一的接口。最常用的协议是 ARP(Address Resolve Protocol,地址解析协议)和 RARP(

    2024年02月02日
    浏览(62)
  • 网络编程1—— IP地址 + 端口号 +TCP/IP协议 + 协议分层的封装与应用

    本人是一个刚刚上路的IT新兵,菜鸟!分享一点自己的见解,如果有错误的地方欢迎各位大佬莅临指导,如果这篇文章可以帮助到你,劳请大家点赞转发支持一下! 从本篇文章开始就要分享网络编程的内容了,越发的感受到了编程的魅力,鸡汤来喽!! 1️⃣单机阶段:计算机跟计算

    2024年02月12日
    浏览(31)
  • 网络编程day2——基于TCP/IP协议的网络通信

            计算机S                                                 计算机C      创建socket对象                                   创建socket对象      准备通信地址(自己的ip(非公网ip))      准备通信地址                                     (计算

    2024年02月10日
    浏览(51)
  • 【Java网络编程】OSI七层网络模型与TCP/IP协议簇

    1.1、OSI七层网络模型 OSI七层网络模型中,每层的功能如下: 应用层:人与计算机网络交互的窗口。 表示层:负责数据格式的封装,如加密、压缩、编解码等。 会话层:建立、终止、管理不同端间的会话连接。 传输层:提供端到端(两台机器)之间的传输机制,以及提供流

    2024年04月11日
    浏览(36)
  • 【Java EE初阶十五】网络编程TCP/IP协议(二)

            tcp的socket api和U大片的socket api差异很大,但是和前面所讲的文件操作很密切的联系         下面主要讲解两个关键的类:         1、ServerSocket:给服务器使用的类,使用这个类来绑定端口号         2、Socket:即会给服务器使用,又会给客户端使用;         

    2024年02月20日
    浏览(40)
  • Java网络编程之IP,端口号,通信协议(UDP,TCP)

    ① C/S :客户端/服务器 在用户本地需要下载安装客户端程序,在远程有一个服务器端程序。 优点:画面精美,用户体验好 缺点:用户需要下载更新 ② B/S :浏览器/服务器 只需要一个浏览器,用户通过指定网址访问对应的服务器。 优点:不需要开发客户端,只需要页面+服务

    2024年02月03日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包