带你了解TCP(一)

基本认识

报文格式

带你了解TCP(一)
序列号:连接时用随机值作为初始值,通过SYN包传给接收端,发送一次数据,累加一次数据字节的大小。用来解决网络包乱序问题。

确认应答号:下一次期望收到数据的序列号,发送端收到应答号认为这个序号以前的数据已经被正常接收。用来解决不丢包问题。

控制位:

  • ACK: 该位为1时,确认应答字段变为有效。
  • RST: 该位为1时,TCP连接出现异常必须强制断开连接。
  • SYN: 该位为1时,表示希望建立连接。
  • FIN:该位为1时,表示希望断开连接。

常见问题

  1. 为什么需要TCP协议?

IP层的不可靠,不保证网络包的交付与完整性。需要保证网络数据包的可靠性,就需要由上层的TCP协议来负责。TCP是一个工作在传输层的可靠数据传输,能确保接收端接收的网络包是无损坏、无间隔、非冗余和按序的。

带你了解TCP(一)

  1. 什么是TCP?

    面向连接的、可靠的、基于字节流的传输层通信协议。

    面向连接:一对一连接。一对多无法做到。

    可靠的:无论网络链路怎样变化,TCP都可以保证一个报文一定能够到达接收端。

    字节流:消息没有边界,无论消息多大都可以传输;消息有序;重复报文自动丢弃。

  2. 什么是TCP连接?

    用于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括Socket、序列号和窗口的大小称为连接。

    建立一个TCP连接需要客户端与服务器端达成以上三个共识。

    socket:由IP地址和端口号组成。

    序列号:用来解决乱序问题。

    窗口大小:用来做流量控制。

  3. 如何确定一个TCP连接?

四元组:

源地址

源端口

目的地址

目的端口

其中,源地址和目的地址字段(32位)在IP头部,作用是通过IP协议发送报文给对方主机。

源端口和目的端口字段(16位)是在TCP的头部中,作用是告诉TCP协议应该把报文发送给哪个进程。

  1. TCP的最大连接数是多少?

    最大TCP连接数 = 客户端的IP数 * 客户端的端口数

    服务端的最大并发TCP连接数远远不能达到理论上限。原因:
    文件描述符限制,socket都是文件,需要通过ulimit配置文件描述符的数目;

    内存限制,每个TCP连接都要占用一定内存,操作系统的内存是优先的。

  2. UDP和TCP的区别?应用场景?

    UDP不提供复杂的控制机制,利用IP提供面向无连接的通信服务。

    UDP 协议简单,头部只有8个字节(64位),UDP头部格式如下:

    源端口(16位) 目标端口(16位)

    包长度 (16位) 校验和(16位)

    数据

    区别:

    1. 连接
      • TCP是面向连接的传输层协议,传输数据前先要建立连接
      • UDP是不需要连接,即刻传输数据
    2. 服务对象
      • TCP 是一对一的两点连接。
      • UDP支持一对一、一对多、多对多的通信。
    3. 可靠性
      • TCP的可靠交付数据,数据可以无差错、不重复、不丢失、按时到达。
      • UDP是尽最大努力交付,不保证可靠交付数据。
    4. 拥塞控制、流量控制
      • TCP有拥塞控制和流量控制机制,保证数据传输安全性。
      • UDP没有。
    5. 首部开销
      • TCP头部较长,至少20个字节。
      • UDP头部8个字节,固定不变。
    6. 传输方式
      • TCP流式传输。没有边界,保证顺序可靠。
      • UDP一个包接一个包发送,有边界,会丢包和乱序。
    7. 分片不同
      • TCP数据大小大于MSS大小,会在传输层进行分片,目标主机收到后,会在传输层组装TCP数据包,如果中途丢失一个分片,只需要传输丢失的这个分片。
      • UDP的数据大小如果大于MTU的大小,会在IP层进行分片,目标主机收到后,在IP层组装完成数据,接着再传给传输层,中途丢失一个分片,在实现可靠传输的UDP时需要重传所有的数据包,传输效率很差,所以UDP的报文应该小于MTU。

    应用场景:
    TCP面向连接,能保证数据的可靠性交付,常用于:

    • FTP文件传输
    • HTTP/HTTPS

    UDP面向无连接,可以随时发送数据,常用于:

    • 包总量较少的通信,如DNS、SNMP等
    • 视频、音频等多媒体通信
    • 广播通信
  3. 为什么UDP头部没有首部长度字段,而TCP有?

    TCP头部有可变长的选项字段,头部长度会有所变化,UDP头部长度不会变化,不需要额外记录。

  4. 为什么UDP头部有包长度字段,而TCP头部没有包长度字段?

    TCP数据的长度 = IP总长度 - IP首部长度 - TCP首部长度

    IP的两种长度在首部格式都是已知的。TCP首部长度在TCP首部格式中是已知的。

    UDP同理,但是首部长度需要是4字节的整数倍,UDP需要首部长度。

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习

上一篇:随机过程:三种不同的理解方法


下一篇:数论变换NTT