Linux你必须知道的小知识-26

77 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第21天,点击查看活动详情

3.9 说说 TCP 2次握手行不行?为什么要3次

参考回答

  1. 为了实现可靠数据传输, TCP 协议的通信双方, 都必须维护一个序列号, 以标识发送出去的数据包中, 哪些是已经被对方收到的。 三次握手的过程即是通信双方相互告知序列号起始值, 并确认对方已经收到了序列号起始值的必经步骤
  2. 如果只是两次握手, 至多只有连接发起方的起始序列号能被确认, 另一方选择的序列号则得不到确认

3.10 简述 TCP 和 UDP 的区别,它们的头部结构是什么样的

参考回答

  1. TCP协议是有连接的,有连接的意思是开始传输实际数据之前TCP的客户端和服务器端必须通过三次握手建立连接,会话结束之后也要结束连接。而UDP是无连接的

    TCP协议保证数据按序发送,按序到达,提供超时重传来保证可靠性,但是UDP不保证按序到达,甚至不保证到达,只是努力交付,即便是按序发送的序列,也不保证按序送到。

    TCP协议所需资源多,TCP首部需20个字节(不算可选项),UDP首部字段只需8个字节。

    TCP有流量控制和拥塞控制,UDP没有,网络拥堵不会影响发送端的发送速率

    TCP是一对一的连接,而UDP则可以支持一对一,多对多,一对多的通信。

    TCP面向的是字节流的服务,UDP面向的是报文的服务。

  2. TCP头部结构如下:

    /*TCP头定义,共20个字节*/ typedef struct _TCP_HEADER {  short m_sSourPort;       // 源端口号16bit  short m_sDestPort;       // 目的端口号16bit  unsigned int m_uiSequNum;       // 序列号32bit  unsigned int m_uiAcknowledgeNum;  // 确认号32bit  short m_sHeaderLenAndFlag;     // 前4位:TCP头长度;中6位:保留;后6位:标志位  short m_sWindowSize;       // 窗口大小16bit  short m_sCheckSum;       // 检验和16bit  short m_surgentPointer;     // 紧急数据偏移量16bit }__attribute__((packed))TCP_HEADER, *PTCP_HEADER;
    
/* TCP头中的选项定义 kind(8bit)+Length(8bit,整个选项的长度,包含前两部分)+内容(如果有的话) KIND = 1表示 无操作NOP,无后面的部分  2表示 maximum segment   后面的LENGTH就是maximum segment选项的长度(以byte为单位,1+1+内容部分长度)  3表示 windows scale     后面的LENGTH就是 windows scale选项的长度(以byte为单位,1+1+内容部分长度)  4表示 SACK permitted    LENGTH为2,没有内容部分  5表示这是一个SACK包     LENGTH为2,没有内容部分  8表示时间戳,LENGTH为10,含8个字节的时间戳 */  typedef struct _TCP_OPTIONS {  char m_ckind;  char m_cLength;  char m_cContext[32]; }__attribute__((packed))TCP_OPTIONS, *PTCP_OPTIONS; ```  UDP头部结构如下: ```cpp /*UDP头定义,共8个字节*/  typedef struct _UDP_HEADER {  unsigned short m_usSourPort;       // 源端口号16bit  unsigned short m_usDestPort;       // 目的端口号16bit  unsigned short m_usLength;        // 数据包长度16bit  unsigned short m_usCheckSum;      // 校验和16bit }__attribute__((packed))UDP_HEADER, *PUDP_HEADER;  ```