精华内容
下载资源
问答
  • html5的websocket能够建立udp连接吗?就是客户端和客户端的连接,如果所有的连接都通过服务器,那人多了服务器压力就暴增了
  • 所有的TCP,UDP,ICMP及IGMP数据都以IP数据报格式传输。IP提供不可靠的,无连接的数据传送服务。不可靠指它不能保证IP数据报能成功到达目的地不可靠(unreliable)的意思是它不能保证IP数据报能成功地到达目的地。IP仅...

    IP协议

    IP协议

    IP协议是TCP/IP协议簇中的核心协议,也是TCP/IP的载体。所有的TCP,UDP,ICMP及IGMP数据都以IP数据报格式传输。IP提供不可靠的,无连接的数据传送服务。不可靠指它不能保证IP数据报能成功到达目的地

    不可靠(unreliable)的意思是它不能保证IP数据报能成功地到达目的地。IP仅提供最好的传输服务。如果发生某种错误时,如某个路由器暂时用完了缓冲区,IP有一个简单的错误处理算法:丢弃该数据报,然后发送ICMP消息报给信源端。任何要求的可靠性必须由上层来提供(如TCP)。

    无连接(connectionless)这个术语的意思是IP并不维护任何关于后续数据报的状态信息。每个数据报的处理是相互独立的。这也说明,IP数据报可以不按发送顺序接收。如果一信源向相同的信宿发送两个连续的数据报(先是A,然后是B),每个数据报都是独立地进行路由选择,可能选择不同的路线,因此B可能在A到达之前先到达。

    0454e1e1040302e28f1c86ca374a8b67.png

    IP报文介绍

    f55dcda5f9964e45ea963e0724c44ad6.png

    • 4位版本号。包含IP数据报的版本号:ipv4为4,ipv6为6

    • 4位首部长度

    • 8位服务类型

    • 16位总长度

    • 标识字段:长度为16位,最多分配的ID值为65535个

    IP地址分类

    IPV4被分为五大类:ABCDE

    A类为:点分四组中的第一组地址范围为0~127的IP地址。已二进制来看就是“首位为0”

    B类:128~191.二进制首位为10

    C类:192~223.二进制首位为110

    D类:224~239.二进制首位为1110

    E类:240~255.二进制首位为1111

    UDP协议

    UDP(用户数据报协议)

    用户数据报协议(User Datagram Protocol,UDP)UDP是OSI参考模型中一种无连接的传输层协议,它主要用于不要求分组顺序到达的传输中,分组传输顺序的检查与排序由应用层完成 ,提供面向事务的简单不可靠信息传送服务。

    一、UDP协议

    1、面向事物,不是面向链接

    2、UDP不提供可靠性:它把应用程序传给IP层的数据发送出去,但是并不保证它们能到达目的地

    简单的可以理解UDP就是类似一个邮寄员的角色。你只要告诉它,对方的地址和电话。邮递员就把你的快递送到对应的地方,但是中间可能会丢失。对方收到没有,就不管了。

    UDP头部信息

    指定通信的源端端口号、目的端端口号、UDP长度、校验和、数据

    60bbe1ed9a76633bf915db79b7e5f812.png

    UDP报文各个位置详解:

    • 1、源端口号,16bit

    • 2、目的端口号:数据接收者的端口号,16bit

    • 3、UDP长度:UDP长度字段指的是UDP首部和UDP数据的字节长度。该字段的最小值为8字节

    • 4、UPD校验和:UDP检验和覆盖UDP首部和UDP数据

    • 5、首部长度:首部中32bit字的数目,可表示15*32bit=60字节的首部。一般首部长度为20字节。

    • 6、数据

    使用wireshark抓包查看对应的字段信息。

    f35923b2489b9a09a4b59f3459c95fb5.png

    UDP 是一个简单的传输层协议。和 TCP 相比,UDP 有下面几个显著特性:

    • UDP 缺乏可靠性。UDP 本身不提供确认,序列号,超时重传等机制。UDP 数据报可能在网络中被复制,被重新排序。即 UDP 不保证数据报会到达其最终目的地,也不保证各个数据报的先后顺序,也不保证每个数据报只到达一次

    • UDP 数据报是有长度的。每个 UDP 数据报都有长度,如果一个数据报正确地到达目的地,那么该数据报的长度将随数据一起传递给接收方。而 TCP 是一个字节流协议,没有任何(协议上的)记录边界。

    • UDP 是无连接的。UDP 客户和服务器之前不必存在长期的关系。UDP 发送数据报之前也不需要经过握手创建连接的过程。

    • UDP 支持多播和广播。

    websocket协议

    Websocket协议

    Websocket是html5提出的一个协议规范,参考rfc6455。

    websocket约定了一个通信的规范,通过一个握手的机制,客户端(浏览器)和服务器(webserver)之间能建立一个类似tcp的连接,从而方便C-S之间的通信。在websocket出现之前,web交互一般是基于http协议的短连接或者长连接。

    WebSocket是为解决客户端与服务端实时通信而产生的技术。websocket协议本质上是一个基于tcp的协议,是先通过HTTP/HTTPS协议发起一条特殊的http请求进行握手后创建一个用于交换数据的TCP连接,此后服务端与客户端通过此TCP连接进行实时通信。

    Websocket和HTTP协议的关系

    同样作为应用层的协议,WebSocket在现代的软件开发中被越来越多的实践,和HTTP有很多相似的地方,这里将它们简单比较:

    相同点

    1. 都是基于TCP的应用层协议。

    2. 都使用Request/Response模型进行连接的建立。

    3. 在连接的建立过程中对错误的处理方式相同,在这个阶段WS可能返回和HTTP相同的返回码。

    4. 都可以在网络中传输数据。

    不同点

    1. WS使用HTTP来建立连接,但是定义了一系列新的header域,这些域在HTTP中并不会使用。

    2. WS的连接不能通过中间人来转发,它必须是一个直接连接。

    3. WS连接建立之后,通信双方都可以在任何时刻向另一方发送数据。

    4. WS连接建立之后,数据的传输使用帧来传递,不再需要Request消息。

    5. WS的数据帧有序。

    协议

    1. 握手

    客户端发起握手。

    GET /chat HTTP/1.1Host: server.example.comUpgrade: websocketConnection: UpgradeSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==Origin: http://example.com Sec-WebSocket-Protocol: chat, superchatSec-WebSocket-Version: 13

    从上面的协议中可以看到websocket基于HTTP协议的GET。而且只支持GET.

    Upgrade:upgrade是HTTP1.1中用于定义转换协议的header域。它表示,如果服务器支持的话,客户端希望使用现有的「网络层」已经建立好的这个「连接(此处是TCP连接)」,切换到另外一个「应用层」(此处是WebSocket)协议。

    Connection:HTTP1.1中规定Upgrade只能应用在「直接连接」中,所以带有Upgrade头的HTTP1.1消息必须含有Connection头,因为Connection头的意义就是,任何接收到此消息的人(往往是代理服务器)都要在转发此消息之前处理掉Connection中指定的域(不转发Upgrade域)。

    Sec-WebSocket-*:第7行标识了客户端支持的子协议的列表(关于子协议会在下面介绍),第8行标识了客户端支持的WS协议的版本列表,第5行用来发送给服务器使用(服务器会使用此字段组装成另一个key值放在握手返回信息里发送客户端)。

    服务端响应

    HTTP/1.1 101 Switching ProtocolsUpgrade: websocketSec-Websocket-Accept: ZEs+c+VBk8Aj01+wJGN7Y15796g=Connection: UpgradeSec-WebSocket-Protocol: chat, superchat

    Sec-Websocket-Accept 是一个校验。用客户端发来的sec_key 服务器通过sha1计算拼接商GUID【258EAFA5-E914-47DA-95CA-C5AB0DC85B11 】 。然后再base64encode

    数据传输

    客户端和服务器连接成功后,就可以进行通信了,通信协议格式是WebSocket格式,服务器端采用Tcp Socket方式接收数据,进行解析,协议格式如下:

    e3b067a91497f402a31abee9c939f63e.png

    这里使用的是数据存储的位(bit),当进行加密的时候,最终要的一位就是最左边的第一个。

    • FIN :1bit ,表示是消息的最后一帧,如果消息只有一帧那么第一帧也就是最后一帧。

    • RSV1,RSV2,RSV3:每个1bit,必须是0,除非扩展定义为非零。如果接受到的是非零值但是扩展没有定义,则需要关闭连接。

    • Opcode:4bit,解释Payload数据,规定有以下不同的状态,如果是未知的,接收方必须马上关闭连接。状态如下:0x0(附加数据帧) 0x1(文本数据帧) 0x2(二进制数据帧) 0x3-7(保留为之后非控制帧使用) 0xB-F(保留为后面的控制帧使用) 0x8(关闭连接帧) 0x9(ping) 0xA(pong)

    • Mask:1bit,掩码,定义payload数据是否进行了掩码处理,如果是1表示进行了掩码处理。

      Masking-key域的数据即是掩码密钥,用于解码PayloadData。客户端发出的数据帧需要进行掩码处理,所以此位是1。
    • Payload length:7位,7 + 16位,7+64位,payload数据的长度,如果是0-125,就是真实的payload长度,如果是126,那么接着后面的2个字节对应的16位无符号整数就是payload数据长度;如果是127,那么接着后面的8个字节对应的64位无符号整数就是payload数据的长度。

    • Masking-key:0到4字节,如果MASK位设为1则有4个字节的掩码解密密钥,否则就没有。

    • Payload data:任意长度数据。包含有扩展定义数据和应用数据,如果没有定义扩展则没有此项,仅含有应用数据。

    服务端简单实现

    // 封装ws 协议的数据包function build($msg) {    $frame = [];    $frame[0] = '81'; // 81 就是 10000001 第一位1表示最后一个数据段,最后一位1表示这是文本数据    $len = strlen($msg);    if ($len < 126) {      //7位长度 第一个是掩码 默认是0      //小于126的时候 也是 01111110 数据包第二个字节表示长度        $frame[1] = $len < 16 ? '0' . dechex($len) : dechex($len);    } else if ($len < 65025) {      //7位 + 16位  01111110 00000000 00000000        $s = dechex($len);        $frame[1] = '7e' . str_repeat('0', 4 - strlen($s)) . $s;    } else {      //7位 + 64位  01111111 00000000 00000000        $s = dechex($len);        $frame[1] = '7f' . str_repeat('0', 16 - strlen($s)) . $s;    }    $data = '';    $l = strlen($msg);    for ($i = 0; $i < $l; $i++) {        $data .= dechex(ord($msg{$i}));    }    //最后是数据内容    $frame[2] = $data;    $data = implode('', $frame);    return pack("H*", $data);}//拆包function parse($buffer) {        $decoded = '';        $len = ord($buffer[1]) & 127;        if ($len === 126) {            $masks = substr($buffer, 4, 4);            $data = substr($buffer, 8);        } else if ($len === 127) {            $masks = substr($buffer, 10, 4);            $data = substr($buffer, 14);        } else {            $masks = substr($buffer, 2, 4);            $data = substr($buffer, 6);        }        for ($index = 0; $index < strlen($data); $index++) {            $decoded .= $data[$index] ^ $masks[$index % 4];        }        return $decoded;    }$socket = stream_socket_server("tcp://0.0.0.0:8888", $errno, $errstr);if (!$socket) {    echo "$errstr ($errno)
    \n";
      die;}while (1) {   $conn = stream_socket_accept($socket);   $data = stream_get_contents($conn,500);   $data = explode("\r\n",$data);   $secKey = "";   foreach ($data as $key=>$val) {       if (strpos($val,"WebSocket-Key:") >= 1 ) {           $key = explode(":",$val );           $secKey = $key[1];       }   }   //固定key 算法 base64(sha1(key+258EAFA5-E914-47DA-95CA-C5AB0DC85B11))   $hashkey =   base64_encode(sha1(trim($secKey)."258EAFA5-E914-47DA-95CA-C5AB0DC85B11",true));   $ws = "HTTP/1.1 101 Switching Protocols\r\n";   $ws .= "Upgrade: websocket\r\n";   $ws .= "Connection: Upgrade\r\n";   $ws .= "Sec-WebSocket-Version:13\r\n";   $ws .= "Sec-WebSocket-Accept: $hashkey\r\n";   $ws .= "Sec-WebSocket-Protocol: chat\r\n";   $ws .= "\r\n";   if (!$conn) {       continue;   }   fwrite($conn, $ws);   fwrite($conn,build("hello"));   fclose($conn);   break;}fclose($socket);

    客户端

    var websocket = new WebSocket("ws://127.0.0.1:8888","chat")websocket.onopen = function(){}websocket.onmessage = function(){}websocket.onclose = function(){}
    展开全文
  • websocket连接经过zuul网关的坑

    万次阅读 2018-09-07 16:31:31
    之前的项目中,使用zuul网关统一过滤域名,为了管理方便,想要尝试看看能不能使用zuul管理websocket连接。 现象描述 高版本的websocket在第一次http请求后,使用的是更快速的tcp连接 zuul网关只能管理http请求...

    前言

    之前的项目中,使用zuul网关统一过滤域名,为了管理方便,想要尝试看看能不能使用zuul管理websocket连接。

    现象描述

    1. 高版本的websocket在第一次http请求后,使用的是更快速的tcp连接
    2. zuul网关只能管理http请求,并且不支持tcp以及udp请求
    3. websocket在经过zuul以后,就会降级会http请求(轮询的方式)

    结论

    最好是不要通过zuul来管理websocket连接,降级为轮询后,效率会降低很多。

    展开全文
  • 现阶段socket通信使用TCP、UDP协议,其中TCP协议相对来说比较安全稳定!本文也是来讲解TCP为主(恕在下学艺不精)。 下面是个人理解的tcp/ip进行通讯之间的三次握手! 1.客户端先发送报文到服务端 2.服务端接受...

    前言

    现阶段socket通信使用TCP、UDP协议,其中TCP协议相对来说比较安全稳定!本文也是来讲解TCP为主(恕在下学艺不精)。      

    下面是个人理解的tcp/ip进行通讯之间的三次握手!

    1.客户端先发送报文到服务端

    2.服务端接受到报文之后进行回复

    3.客户端收到回复之后再次发送确认信息。这个时候才是正式进行连接。

    什么是WebSocket 

    WebSocket 是一种网络通信协议。RFC6455 定义了它的通信标准。

    WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。

    与传统的HTTP协议对比:

    HTTP 协议是一种无状态的、无连接的、单向的应用层协议。它采用了请求/响应模型。通信请求只能由客户端发起,服务端对请求做出应答处理。也就是说HTTP没有办法做到在客户端不请求服务器的情况下主动给客户端发送消息。但是这种情况有时确实我们必须的。当然我们在WebSocket之前我们也是有办法解决的,比如我们使用轮询技术来实现一部分的目的,但是有了WebSocket是必轮询更加合理的解决方案。

    WebSocket API介绍

    创建WebSocket 对象,这是所有步骤的第一步。

    var Socket = new WebSocket(url, [protocol] );

    WebSocket 对象属性

    Socket.readyState:只读属性 readyState 表示连接状态,可以是以下值:0 - 表示连接尚未建立。1 - 表示连接已建立,可以进行通信。2 - 表示连接正在进行关闭。3 - 表示连接已经关闭或者连接不能打开。

    Socket.bufferedAmount:只读属性 bufferedAmount 已被 send() 放入正在队列中等待传输,但是还没有发出的 UTF-8 文本字节数。

    WebSocket 事件

    WebSocket 存在基本的的四个事件处理

    Socket.onopen:连接建立时触发

    Socket.onmessage:客户端接受到服务器发送的消息时候触发

    Socket.onerror:通许期间发生错误时触发

    Socket.onclose:连接关闭触发,不管你主动还是被动的

    WebSocket 方法

    Socket.send():发送消息给服务器

    Socket.close():关闭连接,客户端主动关闭。

    连接形式:

          服务器监听:服务器开启服务之后,就进入了监听客户端连接状态。此时不是指定监听那台客户端那是处于一个等待状态(不是暂停,一直处于网络实时监听),等待客户端找他进行连接。

           客户端连接:客户端对目标服务器发起链接请求,发起请求必须要知道IP以及相应端口号。

           确认链接:这个时候服务端的监听就起作用了,受到客户端的请求后会响应客户端请求,创建socket链接。在这里需要注意链接不是一对一的,服务端会重新对请求客户端创建新的socket服务。所以服务端仍处于监听状态仍可以监听。

    代码示例

    好了以上就是一些基本介绍,主要是为了以下的东西做铺垫,毕竟要实现需要有socket的基础,言归正传。下面开始我们完整的webSocket练习吧!(网上有些使用插件或者类库实现的websocket。但是我们所讲的是以socket为基础的)

    创建服务器

    别的不多少首先创建socket服务器:

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 using System.Net.Sockets;
     7 using System.Net;
     8 using System.Threading;
     9 using System.Text.RegularExpressions;
    10 using System.Security.Cryptography;
    11 
    12 namespace SocketService
    13 {
    14     class SocketService
    15     {
    16         private static byte[] result = new byte[1024];
    17         private static int myProt = 8885;   //端口  
    18         static Socket serverSocket;  //服务器服务
    19         public void Start()
    20         {
    21             //服务器IP地址  
    22             IPAddress ip = IPAddress.Parse("127.0.0.1");
    23             //socket的构造函数进行服务注册
    24             serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    25             //绑定IP地址:端口  
    26             serverSocket.Bind(new IPEndPoint(ip, myProt));
    27             //设定最多10个排队连接请求 
    28             serverSocket.Listen(10);
    29             Console.WriteLine("启动监听{0}成功", serverSocket.LocalEndPoint.ToString());
    30             //通过Clientsoket发送数据  
    31             Thread myThread = new Thread(ListenClientConnect);
    32             myThread.Start();
    33             Console.ReadLine();
    34         }
    35         /// <summary>  
    36         /// 监听客户端连接  
    37         /// </summary>  
    38         private  void ListenClientConnect()
    39         {
    40             while (true)
    41             {
    42                 Socket clientSocket = serverSocket.Accept();
    43                // clientSocket.Send(Encoding.ASCII.GetBytes("Server Say Hello"));
    44                 Thread receiveThread = new Thread(ReceiveMessage);
    45                 receiveThread.Start(clientSocket);
    46             }
    47         }
    48 
    49         /// <summary>  
    50         /// 接收消息  
    51         /// </summary>  
    52         /// <param name="clientSocket"></param>  
    53         private  void ReceiveMessage(object clientSocket)
    54         {
    55             Socket myClientSocket = (Socket)clientSocket;
    56             while (true)
    57             {
    58                 try
    59                 {
    60                     //通过clientSocket接收数据  
    61                     int receiveNumber = myClientSocket.Receive(result);
    62                     //  websocket建立连接的时候,除了TCP连接的三次握手,websocket协议中客户端与服务器想建立连接需要一次额外的握手动作
    63                     string msg = Encoding.UTF8.GetString(result, 0, receiveNumber);
    64                     var buffer = result;
    65                     if (msg.Contains("Sec-WebSocket-Key"))
    66                     {
    67 
    68                         myClientSocket.Send(PackageHandShakeData(buffer, receiveNumber));
    69 
    70                        // return;
    71                     }
    72                     var ss = AnalyzeClientData(result, receiveNumber);
    73                     Console.WriteLine("接收客户端{0}消息{1}", myClientSocket.RemoteEndPoint.ToString(), Encoding.UTF8.GetString(result, 0, receiveNumber));
    74                 }
    75                 catch (Exception ex)
    76                 {
    77                     Console.WriteLine(ex.Message);
    78                     myClientSocket.Shutdown(SocketShutdown.Both);
    79                     myClientSocket.Close();
    80                     break;
    81                 }
    82             }
    83         }
    84  }
    85 }
    View Code

     代码注释我已经写的很详细了!希望你们能看懂(哈哈)!

     看到这里有些聪明的网友可能发现问题了!或者操作过但是没有成功的也看出了不同。没有错,在这里我要说明的一点是有些websocket与socket有点不同的就是他的握手的首次信息以及返回信息是需要特定格式的。

    也就是所谓的响应头域需要特殊处理。在不做相对应的响应处理浏览器会报“握手不成功”的错误!

    参考网址:http://www.cnblogs.com/smark/archive/2012/11/26/2789812.html 

    如果初步同学没有看明白请移至另一篇博客,详细封装了此方法解决此错误。(方便有些同学查找错误找不到解决方法,因为鄙人也是搞了一上午才有幸发现此问题,还望海涵)

    最后我们只需要在主方法进行调用开启服务

    此时服务端代码大功告成!下面我们使用js来进行请求就可以了。

    客户端

    下面附送html建议代码也可以去w3c查看教程:

    html代码:

        <body>
            <a href="javascript:WebSocketTest()">运行 WebSocket</a>
            <a href="javascript:webSocketClose()">关闭WebSocket</a>
            <div id="look" class="m">
    
            </div>
            <input id="message">
            <a href="javascript:send()">发送消息</a>
        </body>

    javascript代码:

    var ws;
    
    function WebSocketTest() {
        if("WebSocket" in window) {
            alert("您的浏览器支持 WebSocket!");
    
            // 打开一个 web socket
            ws = new WebSocket("ws://127.0.0.1:8885");
    
            ws.onopen = function() {
                // Web Socket 已连接上,使用 send() 方法发送数据
                ws.send("发送数据");
                alert("数据发送中...");
            };
    
            ws.onmessage = function(evt) {
                var received_msg = evt.data;
                document.getElementById("look").html+=received_msg;
                alert("数据已接收...");
            };
    
            ws.onclose = function() {
                // 关闭 websocket
                alert("连接已关闭...");
            };
        } else {
            // 浏览器不支持 WebSocket
            alert("您的浏览器不支持 WebSocket!");
        }
    }
    
    function webSocketClose() {
    ws.close();
    alert("关闭了通讯")
    }
    function send(){
        var msg= document.getElementById("message").value;
        if(msg==""||msg==undefined){
            alert("请填写发送内容!")
            return;
        }
        ws.send("1111111111");
        alert("发送了消息")
    }
    View Code

    最后附上运行截图:

     

    好了以上就是webSocket的一些基础介绍和简单的代码示例。

    下一篇在此基础上完善成一个聊天示例:【WebSocket No.2】WebSocket和Socket实现聊天群发

    转载于:https://www.cnblogs.com/yanbigfeg/p/7338141.html

    展开全文
  • 这种建立连接的方法可以防止产生错误的连接,TCP使用的流量控制协议是可变大小的滑动窗口协议。 TCP三次握手的过程如下: 客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。 服务器端收到SYN...

    tcp

    三次握手

    TCP是因特网中的传输层协议,使用三次握手协议建立连接。当主动方发出SYN连接请求后,等待对方回答SYN+ACK ,并最终对对方的 SYN 执行 ACK 确认。这种建立连接的方法可以防止产生错误的连接,TCP使用的流量控制协议是可变大小的滑动窗口协议。 TCP三次握手的过程如下:

    • 客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。
    • 服务器端收到SYN报文,回应一个SYN (SEQ=y)ACK(ACK=x+1)报文,进入SYN_RECV状态。
    • 客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态。

    连接成功

    连接成功之后双方即可互相传输字节流,并随时可关闭连接,传输的数据有以下特性

    • 传输的数据被tcp分割成了最适合发送的数据块 传递给ip协议,这个发送数据称为 报文段 或 段

    • tcp作为可靠性连接,每次发送数据段,会启动一个定时器,每次接收数据段,会发送一次确认,如果定时器没有及时收到确认,则会重发数据

    • TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段(希望发端超时并重发)。

    • 两个应用程序通过TCP连接交换8bit字节构成的字节流。TCP不在字节流中插入记录标识符。我们将这称为字节流服务(bytestreamservice)。如果一方的应用程序先传10字节,又传20字节,再传50字节,连接的另一方将无法了解发方每次发送了多少字节。只要自己的接收缓存没有塞满,TCP 接收方将有多少就收多少。一端将字节流放到TCP连接上,同样的字节流将出现在TCP连接的另一端。

    四次挥手

    建立一个连接需要三次握手,而终止一个连接要经过四次挥手,这是由TCP的半关闭(half-close)造成的。具体过程如下所示。

    • 某个应用进程首先调用close,称该端执行“主动关闭”(active close)。该端的TCP于是发送一个FIN分节,表示数据发送完毕。
    • 接收到这个FIN的对端执行 “被动关闭”(passive close),这个FIN由TCP确认。
    • 注意:FIN的接收也作为一个文件结束符(end-of-file)传递给接收端应用进程,放在已排队等候该应用进程接收的任何其他数据之后,因为,FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接收。
    • 一段时间后,接收到这个文件结束符的应用进程将调用close关闭它的套接字。这导致它的TCP也发送一个FIN。
    • 接收这个最终FIN的原发送端TCP(即执行主动关闭的那一端)确认这个FIN。 既然每个方向都需要一个FIN和一个ACK,因此通常需要4个分节

     

    http一次请求的过程:

    • 用户在浏览器输入网址
    • dns服务器解析/或者本机hosts,路由器hosts对比 获得ip
    • 浏览器访问默认端口80,则访问的tcp地址为 ip:80
    • tcp协议3次握手,建立连接
    • 发送一个http request请求头
    • 服务器获得http request请求头,表明该次访问为http访问,解析http请求头,获得请求类型,请求格式,以及请求数据(cookie,get,post数据)
    • 服务器发送response响应数据,主动断开
    • 浏览器接收response响应数据,解析响应文本类型,解析数据,断开连接

      https协议中,在请求以及响应时多了一层tls,ssl加密解密协议,默认端口从80变为了443

      websocket:

    • websocket连线过程中,需要通过浏览器发出websocket连线请求,然后服务器发出回应,这个过程通常称为“握手” 。在 WebSocket API,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。在此WebSocket 协议中,为我们实现即时服务带来了两大好处:

    • Header: 互相沟通的Header是很小的-大概只有 2 Bytes
    • Server Push: 服务器的推送,服务器不再被动的接收到浏览器的请求之后才返回数据,而是在有新数据时就主动推送给浏览器。

    udp与tcp

    udp和tcp都属于传输层的协议,都位于ip协议的顶层,他们不同之处有:

    • udp是无连接协议,不需要进行tcp的握手
    • udp每次发送最大长度是65535,而tcp在握手后可以源源不断的发送
    • udp协议使用报头中的校验值来保证数据的安全。校验值首先在数据发送方通过特殊的算法计算得出,在传递到接收方之后,还需要再重新计算。如果某个数据报在传输过程中被第三方篡改或者由于线路噪音等原因受到损坏,发送和接收方的校验计算值将不会相符,由此UDP协议可以检测是否出错。这与TCP协议是不同的,后者要求必须具有校验值。
    • udp报文没有可靠性保证、顺序保证和流量控制字段等,可靠性较差。但是正因为udp协议的控制选项较少,在数据传输过程中延迟小、数据传输效率高,适合对可靠性要求不高的应用程序,或者可以保障可靠性的应用程序,如DNS、TFTP、SNMP等。
    • 在网络质量令人十分不满意的环境下,UDP协议数据包丢失会比较严重。而tcp会进行确认验证,确保对方接收成功
    • udp可实现对网关内的所有主机进行广播
    展开全文
  • 2.WebSocket:应用层协议,高效的解决Http协议在请求后必须长时间等待,采用全双工通信,实现了多路复用,在webSocket协议下客服端和浏览器可以同时发送信息。3.Socket:并不是协议,是应用层与传输层间的一...
  • TCP和UDP都是网络中传输层协议,但如果要构建高效的网络应用,就应该从传输层下手。对于常见的应用场景,无须从应用层协议入手构建自己的应用,使用经典的HTTP或者SMTP等就够用了。 HTTP HTTP的报文可以通过下面这样...
  • TCP/UDPwebSocket

    2019-07-11 17:24:16
    特点:面向有链接,所有问题都要建立连接,数据安全,完整,三次握手后建立连接后才可以数据传输 TCP协议传输的客户端 package ClientAndServer_TCP; import java.io.InputStream; import java.io.OutputStream; ...
  • 1: webSocket 一般情况Web 应用的交互过程通常是客户端通过浏览器发出一个请求,服务器端接收请求后进行处理并返回... 浏览器通过 JavaScript 向服务器发出建立 WebSocket 连接的请求,连接建立以后,客户端和服...
  • 所有的TCP,UDP,ICMP及IGMP数据都以IP数据报格式传输。IP提供不可靠的,无连接的数据传送服务。不可靠指它不能保证IP数据报能成功到达目的地不可靠(unreliable)的意思是它不能保证IP数据报能成功地到达目的地。IP仅...
  • 在开始前可能我想先简单介绍一下tcp/ip模型 有四层,而且我们都知道高层的协议是基于低层协议的,所以当有人问我tcp和ip或者ip和 1.TCP和UDP TCP是面向连接的一种传输控制协议。...UDP是无连接的用户数据报协...
  • swoole实现websocket连接,Timer定时器

    千次阅读 2018-06-13 16:35:36
    PHP的异步、并行、高性能网络通信引擎,使用纯C语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,异步Redis,数据库连接池,AsyncTask,消息队列,毫秒定时器,异步文件读写,异步DNS...
  • 想要实现点对点通讯,就要理解STOMP的不同操作,对应的Spring Websocket是如何工作的? -
  • CppServer:超快速和低延迟异步套接字服务器和客户端C ++库,支持TCP,SSL,UDP,HTTP,HTTPS,WebSocket协议和10K连接问题解决方案
  • 目录 一、Socket简介 二、WebSocket简介与消息推送 三、WebSocket客户端 四、WebSocket服务器端 五、测试运行 六、小结与消息推送框架 6.1、开源Java消息推送框架 Pushlet ... 7.2、DotNet服务器端手动连接...
  • Udp:用户数据报协议 (UDP:User Datagram Protocol)。 Http全称是HyperText Transfer Protocal,即:超文本传输协议,HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动...
  • 超快速和低延迟异步套接字服务器和客户端C#.NET Core库,支持TCP,SSL,UDP,HTTP,HTTPS,WebSocket协议和解决方案。 内容 产品特点 跨平台(Linux,OSX,Windows) 异步通讯 支持的传输协议: , , , 支持的...
  • 1.HTTP和WebSocket协议的区别: HTTP是无状态的短连接,就是经过一次一来一回的即断开连接。无法记录状态,所以...WebSocket是在H5之后发布的,可以实现双向通信,也是基于TCP的应用层协议。 在他的握手请求中会比HT
  • 就好比现在让你形容一下梯形的定义,如果你不知道定义,你就可能把平行四边形当做特殊的梯形处理,也就有可能把TCP和Socket搞混,更加会纠结TCP连接与Socket连接以及HTTP的长/短连接之间到底有啥区别。 其实有了...
  • 一、这一大堆关键词之间...就好比现在让你形容一下梯形的定义,如果你不知道定义,你就可能把平行四边形当做特殊的梯形处理,也就有可能把TCP和Socket搞混,更加会纠结TCP连接与Socket连接以及HTTP的长/短连接之...
  • 先说一下网络的层级:由下往上分为 物理层、数据链路层、网络层、传输层、会话层、表示层和...UDP:是面向非连接的用户数据报协议。属于传输层协议。所谓的无连接就是在传输数据之前不需要交换信息,没有握手建立连接.
  • 就好比现在让你形容一下梯形的定义,如果你不知道定义,你就可能把平行四边形当做特殊的梯形处理,也就有可能把TCP和Socket搞混,更加会纠结TCP连接与Socket连接以及HTTP的长/短连接之间到底有啥区别。 其实有了区
  • Swoole是一个PHP语言的高性能网络通信框架,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,数据库连接池,AsyncTask,消息队列,毫秒定时器,异步文件读写,异步DNS查询。 Swoole可以广泛...
  • socket与websocket以及http与https重新总结一.socket网络...二.websocketwebsocket就是其中一种,是为了创建一种双向通信(全双工)的协议 ,来弥补http协议在持久通信能力上的不足websocket连接的过程是:首先,客户端...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 216
精华内容 86
关键字:

websocket连接udp