zoukankan      html  css  js  c++  java
  • 二、初识TCP/UDP(传输层)

    一、初识TCP/UDP(传输层)

    引言:TCP(Transmission Control Protocol),又叫传输控制协议,UDP(User Datagram Protocol),又叫用户数据报协议。两者都是是传输层协议,但他们的通信机制与应用场景不同。


    1、TCP与UDP区别

    特点 TCP UDP
    传输方式 字节流 数据报
    连接性 面向连接 面向非连接
    可靠性 可靠 不可靠
    传输效率
    • 面向字节流(TCP)
      面向字节流的话,虽然应用程序和TCP的交互是一次一个数据块(大小不等),TCP把应用程序看成是一连串的无结构的字节流。TCP有一个缓冲,当应用程序传送的数据块太长,TCP就可以把它划分短一些再传送。如果应用程序一次只发送一个字节,TCP也可以等待积累有足够多的字节后再构成报文段发送出去 。

    • 面向报文(UDP)
      面向报文的传输方式是应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。因此,应用程序必须选择合适大小的报文。若报文太长,则IP层需要分片,降低效率。若太短,会是IP太小。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。这也就是说,应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。

    2、TCP相关介绍

    工作机制:紧小细微型。面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据包之前必须先建立一个TCP连接。这一过程与打电话很相似,先拨号振铃,等待对方摘机说“喂”,然后才说明是谁。在一个TCP连接中,仅有两方进行彼此通信。而UDP更像是发短信,将发送方所有的信息,将所有信息一股脑儿全扔到网络中。

    可靠性(可靠)
    1.当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。当TCP收到发自TCP连接另一端的数据,它将发送一个确认。TCP有延迟确认的功能,在此功能没有打开,则是立即确认。功能打开,则由定时器触发确认时间点。


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


    3.既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。如果必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。


    4.TCP的接收端必须丢弃重复的数据。


    5.量控制。TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。


    传输效率(慢)

    1. TCP在传递数据之前,要先建连接,这会消耗时间,而且在数据传递时,确认机制、重传机制、拥塞控制机制等都会消耗大量的时间。
    2.1、TCP传输过程

    TCP建链三次握手过程

    • 1、主机A通过向主机B 发送一个含有同步序列号的标志位的数据段给主机B ,向主机B 请求建立连接,通过这个数据段, 主机A告诉主机B 两件事:我想要和你通信;你可以用哪个序列号作为起始数据段来回应我。

    • 2、主机B 收到主机A的请求后,用一个带有确认应答(ACK)和同步序列号(SYN)标志位的数据段响应主机A,也告诉主机A两件事: 我已经收到你的请求了,你可以传输数据了;你要用哪佧序列号作为起始数据段来回应我 。

    • 3、主机A收到这个数据段后,再发送一个确认应答,确认已收到主机B 的数据段:”我已收到回复,我现在要开始传输实际数据了 这样三次握手就完成了,主机A和主机B 就可以传输数据了。(没有应用层的数据,SYN这个标志位只有在TCP建产连接时才会被置1,握手完成后SYN标志位被置0)

    TCP断链四次握手过程

    • 1、当主机A完成数据传输后,将控制位FIN置1,提出停止TCP连接的请求。

    • 2、主机B收到FIN后对其作出响应,确认这一方向上的TCP连接将关闭,将ACK置1。

    • 3、由B 端再提出反方向的关闭请求,将FIN置1。

    • 4、主机A对主机B的请求进行确认,将ACK置1,双方向的关闭结束。
    1、ACK : TCP报头的控制位之一,对数据进行确认.确认由目的端发出,用它来告诉发送端这个序列号之前的数据段都收到了.比如,确认号为X,则表示前X-1个数据段都收到了,只有当ACK=1时,确认号才有效,当ACK=0时,确认号无效,这时会要求重传数据,保证数据的完整性。
    
    2、SYN : 同步序列号,TCP建立连接时将这个位置1。
    
    3、FIN : 发送端完成发送任务位,当TCP完成数据传输需要断开时,提出断开连接的一方将这位置1。
    

    3、UDP

    工作机制:蛮干型。它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。因此,在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。

    可靠性(可靠)

    1. UDP协议是一种无连接的传输协议,排除信息可靠传递机制带来速度优势的同时,显然降低了可靠性的需求,也就是UDP协议无法得知其是否安全,完整到达的。此外,由于TCP有确认机制、三次握手机制,这些也导致TCP容易被人利用,实现DOS、DDOS、CC等攻击。

    传输效率(慢)

    1. 与TCP协议相比,UDP协议排除了信息可靠传递机制,也就是减少了TCP协议中提供数据包分组、组装和排序的过程需要的时间消耗。其次,UDP是一个无状态的传输协议,所以它在传递数据时非常快。没有TCP的这些机制,UDP较TCP被攻击者利用的漏洞就要少一些。

    4、TCP与UDP编程模型

    * TCP编程的服务器端一般步骤是: 
      1、创建一个socket,用函数socket(); 
      2、设置socket属性,用函数setsockopt(); 
      3、绑定IP地址、端口等信息到socket上,用函数bind(); 
      4、开启监听,用函数listen(); 
      5、接收客户端上来的连接,用函数accept(); 
      6、收发数据,用函数send()和recv(),或者read()和write(); 
      7、关闭网络连接; 
      8、关闭监听; 
    
    * TCP编程的客户端一般步骤是: 
      1、创建一个socket,用函数socket(); 
      2、设置socket属性,用函数setsockopt();
      3、绑定IP地址、端口等信息到socket上,用函数bind();
      4、设置要连接的对方的IP地址和端口等属性; 
      5、连接服务器,用函数connect()建立链接; 
      6、收发数据,用函数send()和recv(),或者read()和write(); 
      7、关闭网络连接;
    

      

    * UDP编程的服务器端一般步骤是: 
      1、创建一个socket,用函数socket(); 
      2、设置socket属性,用函数setsockopt();
      3、绑定IP地址、端口等信息到socket上,用函数bind(); 
      4、循环接收数据,用函数recvfrom(); 
      5、关闭网络连接。 
    
    * UDP编程的客户端一般步骤是: 
      1、创建一个socket,用函数socket(); 
      2、设置socket属性,用函数setsockopt();
      3、绑定IP地址、端口等信息到socket上,用函数bind();
      4、设置对方的IP地址和端口等属性; 
      5、发送数据,用函数sendto(); 
      6、关闭网络连接。
    
  • 相关阅读:
    tcpip数据包编码解析(chunk and gzip)_space of Jialy_百度空间
    epoll 事件之 EPOLLRDHUP
    c What is the Difference Between read() and recv() , and Between send() and write()? Stack Overflow
    HTTP KeepAlive详解 IT心雪的日志 网易博客
    北京生活 TIPS 银行服务篇
    eventfdaiotest.c
    北京生活 TIPS 谈谈日常理财
    C语言抓http gzip包并解压 失败 C/C++ ChinaUnix.net
    转:javascript 对象和原型
    转:Javascript原型链和原型的一个误区
  • 原文地址:https://www.cnblogs.com/retry/p/9308767.html
Copyright © 2011-2022 走看看