TCP 和 UDP

TCP/IP五层网络结构模型

  • 物理层:物理层建立在物理通信介质的基础上,作为系统和通信介质的接口,用来实现数据链路实体间透明的比特 (bit) 流传输。只有该层为真实物理通信,其它各层为虚拟通信

  • 数据链路层:在物理层提供比特流服务的基础上,建立相邻结点之间的数据链路,通过差错控制提供数据帧(Frame)在信道上无差错的传输,并进行各电路上的动作系列。数据的单位称为帧(frame)

  • 网络层:选择合适的路由,使数据分组(packet)可以交付到目的主机

  • 传输层:负责主机中进程间的通信

  • 应用层:直接为用户的应用程序提供服务

UDP详解

以下内容来自wiki – 最英俊的百科全书

用户数据报协议(英语:User Datagram Protocol,缩写为UDP),又称使用者资料包协定,是一个简单的面向数据报的传输层协议,正式规范为RFC 768。
在TCP/IP模型中,UDP为网络层以上和应用层以下提供了一个简单的接口。UDP只提供数据的不可靠传递,它一旦把应用程序发给网络层的数据发送出去,就不保留数据备份(所以UDP有时候也被认为是不可靠的数据报协议)。UDP在IP数据报的头部仅仅加入了复用和数据校验(字段)。

UDP的优点

  • 无需建立连接(减少延迟)
  • 实现简单:无需维护连接状态
  • 头部开销小(最小值为8byte)
  • 没有拥塞控制:应用可以更好的控制发送时间和发送速率

UDP头部:

《TCP 和 UDP》

《TCP 和 UDP》

UDP的头部是由源端口号、目标端口号、包长和校验4个部分组成,其中两个是可选的。各16bit的来源端口和目的端口用来标记发送和接受的应用进程。因为UDP不需要应答,所以来源端口是可选的,如果来源端口不用,那么置为零。在目的端口后面是长度固定的以字节为单位的长度域,用来指定UDP数据报包括数据部分的长度,长度最小值为8byte。首部剩下地16bit是用来对首部和数据部分一起做校验和(Checksum)的,checksum主要是用来检测UDP段在传输中是否发生了错误。还有就是,校验和计算中也需要计算UDP伪头部,伪头部包含IP头部的一些字段。我们刚才介绍了识别一个通信需要5项信息,而UDP头部只有端口号,余下的三项在IP头部,所以引入了伪头部的概念。(IPv6的IP头部没有校验和字段)

基于UDP协议的有:

  • 域名系统(DNS)
  • 简单网络管理协议(SNMP)
  • 动态主机配置协议(DHCP)
  • 路由信息协议(RIP)
  • 自举协议(BOOTP)
  • 简单文件传输协议(TFTP)

TCP详解

以下内容来自wiki – 最英俊的百科全书
传输控制协议(英语:Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。
在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。
应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分区成适当长度的报文段(通常受该计算机连接的网络的数据链路层的最大传输单元(MTU)的限制)。之后TCP把结果包传给IP层,由它来通过网络将包传送给接收端实体的TCP层。TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和

三次握手

《TCP 和 UDP》

TCP用三路握手(three-way handshake)过程创建一个连接。在连接创建过程中,很多参数要被初始化,例如序号被初始化以保证按序传输和连接的强壮性。

  • 客户端通过向服务器端发送一个SYN来创建一个主动打开,作为三路握手的一部分。客户端把这段连接的序号设定为随机数A。
  • 服务器端应当为一个合法的SYN回送一个SYN/ACK。ACK的确认码应为A+1,SYN/ACK包本身又有一个随机序号B。
  • 最后,客户端再发送一个ACK。当服务端受到这个ACK的时候,就完成了三路握手,并进入了连接创建状态。此时包序号被设定为收到的确认号A+1,而响应则为B+1。

TCP状态编码

下表为TCP状态码列表,以S指代服务器,C指代客户端,S&C表示两者,S/C表示两者之一:[1]

  • LISTEN S
    等待从任意远程TCP端口的连接请求。侦听状态。
  • SYN-SENT C
    在发送连接请求后等待匹配的连接请求。通过connect()函数向服务器发出一个同步(SYNC)信号后进入此状态。
  • SYN-RECEIVED S
    已经收到并发送同步(SYNC)信号之后等待确认(ACK)请求。
  • ESTABLISHED S&C
    连接已经打开,收到的数据可以发送给用户。数据传输步骤的正常情况。此时连接两端是平等的。
  • FIN-WAIT-1 S&C
    主动关闭端调用close()函数发出FIN请求包,表示本方的数据发送全部结束,等待TCP连接另一端的确认包或FIN请求包。
  • FIN-WAIT-2 S&C
    主动关闭端在FIN-WAIT-1状态下收到确认包,进入等待远程TCP的连接终止请求的半关闭状态。这时可以接收数据,但不再发送数据。
  • CLOSE-WAIT S&C
    被动关闭端接到FIN后,就发出ACK以回应FIN请求,并进入等待本地用户的连接终止请求的半关闭状态。这时可以发送数据,但不再接收数据。
  • CLOSING S&C
    在发出FIN后,又收到对方发来的FIN后,进入等待对方对连接终止(FIN)的确认(ACK)的状态。少见。
  • LAST-ACK S&C
    被动关闭端全部数据发送完成之后,向主动关闭端发送FIN,进入等待确认包的状态。
  • TIME-WAIT S/C
    主动关闭端接收到FIN后,就发送ACK包,等待足够时间以确保被动关闭端收到了终止请求的确认包。【按照RFC 793,一个连接可以在TIME-WAIT保证最大四分钟,即最大分段寿命(maximum segment lifetime)的2倍】
  • CLOSED S&C
    完全没有连接。

基于TCP实现的协议有

  • HTTP/HTTPS,
  • Telnet
  • FTP
  • SMTP

TCP(Transmission Control Protocol)和UDP(User DataGram Protocol)的区别

下面我们主要从连接性(Connectivity)、可靠性(Reliability)、有序性(Ordering)、有界性(Boundary)、拥塞控制(Congestion or Flow control)、传输速度(Speed)、量级(Heavy/Light weight)、头部大小(Header size)等8个方面来对比它们:

  1. TCP是面向连接(Connection oriented)的协议,UDP是无连接(Connection less)协议;
    TCP用三次握手建立连接:1) Client向server发送SYN;2) Server接收到SYN,回复Client一个SYN-ACK;3) Client接收到SYN_ACK,回复Server一个ACK。到此,连接建成。UDP发送数据前不需要建立连接。
  2. TCP可靠,UDP不可靠;TCP丢包会自动重传,UDP不会。
  3. TCP有序,UDP无序;消息在传输过程中可能会乱序,后发送的消息可能会先到达,TCP会对其进行重排序,UDP不会。
  4. TCP无界,UDP有界;TCP通过字节流传输,UDP中每一个包都是单独的。
  5. TCP有流量控制(拥塞控制),UDP没有;主要靠三次握手实现。
  6. TCP传输慢,UDP传输快;因为TCP需要建立连接、保证可靠性和有序性,所以比较耗时。这就是为什么视频流、广播电视、在线多媒体游戏等选择使用UDP。
  7. TCP是重量级的,UDP是轻量级的;TCP要建立连接、保证可靠性和有序性,就会传输更多的信息,如TCP的包头比较大。
  8. TCP的头部比UDP大;TCP头部需要20字节,UDP头部只要8个字节
    原文作者:HTTP
    原文地址: https://juejin.im/post/583d2d6a67f356006bb7d535
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞