首页 > 编程语言 >Untiy 网络编程-深入了解TCP

Untiy 网络编程-深入了解TCP

时间:2023-07-21 11:36:58浏览次数:22  
标签:Untiy IP 编程 端口 TCP 发送 发送数据 连接

1.从TCP到物理层

  应用层

    应用层是给应用程序提供功能的。在发送{hello}的例子里面,计算机会把hello转化为二进制然后发送到传输层。

  传输层

    在收到二进制数据后,传输层协议会对它进行一系列的加工,并提供数据流传送可靠性校验流量控制。又由于网络层的IP包大小有限制(65535),所以还需要有数据拆分的机制,把TCP包拆分为多个IP包。

  网络层

    这一层会把IP包根据目的地址把本地的包路由到目的地。

  网络接口层

    IP协议会继续封装成链路层协议做一些数据校验后,再通过物理介质传输到接收方。

2.数据传输流程

  1)TCP连接的建立

    TCP连接的过程也称为三次握手。

 

    值得注意的是,在第三次握手时,可能由于网络原因,导致第三次握手要等待很久才能返回,因为底层的超时重传机制会导致Server没有收到第三次握手会不断重复发送第二次握手数据包。直到连接成功或者超出重试次数。当双方都ESTABLISHED则连接成功。

  2)TCP数据传输

    TCP传输,在发送方并不能确保数据被对方收到,于是发送会等待接收方回应。如果太长时间没有收到回应也会启用重传机制重发数据。

    同时,发送数据时,TCP会考虑对方缓存区的容量,当对方满时会暂时停止发送数据。同时TCP还会根据返回数据的时间判断当前网络是否“通畅”,以减缓发送报文的间隔。

 

  3)TCP连接终止

    TCP的连接终止称为“四次挥手”

 

3.常用的TCP参数

  1)ReceiveBufferSize:

    指定了接收端缓冲区的大小,当接收端缓冲区满的时候,发送端会暂停发送数据。较大的缓冲区可以减少发送端暂停的概率,提高发送效率。

  2)SendBufferSize:

    指定了发送端缓冲区的大小。对于没有“完整发送数据的项目”(前一个博客),可以使用扩大发送区的方式优化项目性能。

  3)NoDelay:

    对于实时性要求较高的游戏,需要将该值设置为true。Socket在默认情况下使用的是Nagle算法。

    对于传统的TCP连接,假设我们要发送{hello}。经过TCP/IP协议封装之后就成为了{ IP头|TCP头|hello }。总数据量变成了20+20+5=45个字节。假设现在用户频繁的一个一个的发送数据,总数据量就变成了41*5=205字节。比原来多了160字节。

    Nagle算法机制在于,如果发送端多次发送包含少量字节的数据包时,发送端不会立马发送数据,而是累积到一定数量后再发送。这样虽然会提高网络传输效率,但是对实时性也会有影响。所以实时网络游戏要关闭Nagle算法,即打开NoDelay

  4)TTL:

    TTL表示IP包所能经过的最大跳数。TTL的最大作用是防止IP包在网络中无限循环。在游戏开发中为了防止偏远地区的用户无法接收数据,可以尝试提高TTL值来解决问题。

  5)ReuseAddress:

    端口复用,即让同一个端口可以被多个socket使用。一般情况下,一个端口只能由一个进程独占,假设服务端程序都绑定了1234端口,若开启两个服务端程序,虽然,第一个程序能够成功绑定并监听,但是第二个会无法绑定并释放端口。我们知道TCP释放端口会经过大量的时间(四次挥手并等待重发)。或者当服务器崩溃时,Socket也不会立即释放,会等待大量时间重启。

    而我们想要要求,当服务器崩溃时,能够立即重启。端口复用的用途就是,防止服务器重启时,之前绑定的端口还未释放或者程序突然退出导致没有释放的端口。如果使用端口复用就可以启动新的服务器进程时重新绑定新的端口。使用如下:

socket.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.ReuseAddress,true);

  6)LingerState:

    这个关键字是用来设置套接字的保持时间的。即四次挥手时,第二次到第三次之间的等待发送数据的时间。

4.心跳机制   

  TCP连接的正常端口是需要接收FIN报文的,但是如果网络状况不好,虽然已经断开了连接,但是对端依然会认为连接有效,依然占有资源。我们需要使用心跳机制来解决这个问题。

  Socket默认的心跳机制只用将KeepAlive开启即可。但是该方法很鸡肋,默认的等待时间是两个小时。

socket.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.KeepAlive,true);

标签:Untiy,IP,编程,端口,TCP,发送,发送数据,连接
From: https://www.cnblogs.com/CatSevenMillion/p/17570826.html

相关文章

  • 电子书下载 免费pdf Python编程从入门到实践 第2版
    电子书下载-Python编程从入门到实践第2版简介Python是一种简单易学的编程语言,广泛应用于数据分析、人工智能、Web开发等领域。《Python编程从入门到实践》是一本非常受欢迎的Python入门教程。本文将介绍如何下载免费的PDF版本的第2版《Python编程从入门到实践》电子书,并提供一......
  • 【雕爷学编程】Arduino动手做(49)---有源和无源蜂鸣器模块5
    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试多做实验,不管成功与否,都会记录下来——小小的进步或是搞不掂的问题......
  • python斐波那契数列兔子编程
    Python斐波那契数列兔子编程引言斐波那契数列是一个非常经典的数学问题,也是编程中常见的例题之一。它的起源可以追溯到古希腊数学家斐波那契(Fibonacci),他在13世纪的《算盘书》中首次提出了这个数列。斐波那契数列具有很多有趣的特性,而且在计算机科学中有广泛的应用。本文将通过Pyt......
  • TCP就拆不动粘包/拆包问题
    粘包/拆包问题一直都存在,只是到TCP就拆不动了。OSIopen-system-InterconnectionTCP/IP5层协议栈应用层和操作系统的边界是系统调用,对应到网络编程是socketapiTCP/UDP概况TCP粘包问题TCP/IP报头深思 OSI开放系统互联 定义了网络框架,以层为单位实现协议,同时......
  • 【Java编程教程】详解Java 中的对象和类
    在本页中,我们将了解Java对象和类。在面向对象的编程技术中,我们使用对象和类来设计程序。Java中的对象既是物理实体又是逻辑实体,而Java中的类只是逻辑实体。什么是Java中的对象具有状态和行为的实体称为对象,例如椅子、自行车、记号笔、笔、桌子、汽车等。它可以是物理的或逻辑......
  • Unity 网络编程-正确收发数据流
    1.TCP数据流我们知道在使用Socket网络程序时,操作系统会将数据存到发送接收缓存中。程序不能直接操作它们,只能通过socket.Receive,socket.Send等方法来间接操作。在使用以上方法时,如果接收缓存为空,那Receive方法会阻塞。如果发送缓存满了则Send方法会阻塞。粘包半......
  • Factor语言编程示例
    目录语言简介示例语言简介https://rosettacode.org/wiki/Category:FactorFactor是一种基于堆栈的、串联的通用编程语言,注重实用性。Factor最初由SlavaPestov开发,于2003年作为一种为游戏编写的脚本语言诞生。该实现最初是用Java编写的解释器,但后来获得了优化编译器,并使......
  • CherryPy教程_编程入门自学教程_菜鸟教程-免费教程分享
    教程简介CherryPy是一个使用Python编程语言的面向对象的Web应用程序框架。它旨在通过包装HTTP协议来快速开发Web应用程序,但保持在较低级别,并且提供的内容远不及RFC7231中定义的内容。CherryPy入门教程-从基本到高级概念的简单步骤了解CherryPy,包括简介,环境设置,词......
  • C++ 模板编程技术解析
    一、函数模板函数模板实现通用函数,根据传递类型进行编译时实参推导:template<typenameT>Tadd(Ta,Tb){returna+b;}intmain(){intx=1,y=2;doublem=1.5,n=2.5;intz=add(x,y);doublep=add(m,n);return0;}这里te......
  • CODOTA:你需要的JAVA编程AI助手
    最近使用了Codota,令我印象深刻。Codota的目标是让开发更简单、更快。Codota能在后台运行,以便节约时间。1什么是CodotaCodota会学习我们如何在编程,然后反过来帮助我们更好的编程。它会使用AI和机器学习技术来给工作中的人提供与正在写的代码相关的建议。2用Codota编码如果说Codot......