Linux C 系统编程 4-1 网络编程 TCP与UDP协议

该系列文章总纲链接:专题分纲目录 LinuxC 系统编程​​​​​​​


本章节思维导图如下所示(思维导图会持续迭代):

第一层:

第二层:


1 计算机网络基础简介

1.1 计算机网络体系结构简介

计算机网络的体系结构是按照高度结构化设计方法,采用分层原理来实现的。分层的优势有:灵活性好;易于维护和实现、有利于各层之间的协作、有利于标准化。

计算机网络的两种标准:

  1. OSI/RM(Open_Systems_Interconnection_Reference_Model):理论上有所成就的国际标准。OSI体系结构的7层:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。
  2. TCP/IP:实际中的国际标准。即现实中采用的是TCP/IP标准。TCP/IP体系结构的4层:应用层、应用层、传输层、网际层IP、网络接口层。

1.2 TCP/IP模型简介

  • 网络接口层:负责IP数据报的接受和发送;负责网络接口层的协议。
  • 网际层IP:进行路由选择、流量控制和拥塞控制;提供无连接服务的网络层协议。
  • 运输层:建立端到端的连接;运行TCP与UDP协议。
  • 应用层:运行进程间通信的协议;数据的处理。

1.3 面向连接服务和无连接服务

服务的类型分为两类: 面向连接的服务、面向无连接的服务。

  1. 面向连接的服务:在传输数据前,必须先建立连接,当数据传输完毕后,释放连接。特点是需要建立连接、数据传输、释放连接3个过程;每个数据分组中均带有分组数据的源IP和目的IP;传输是可靠的,但是协议较为复杂。
  2. 面向无连接的服务:通信时不需要建立连接与释放连接。特点是不需要建立连接、数据传输、释放连接3个过程;传输是不可靠的,但是协议较为简单。

2 CS(client/server)方式简介

在TCP/IP网络中,两台主机的进程通信采用CS方式,这里的客户端与服务器端均是指进程。对client端和server端的说明如下:

@1 client端:首先发起请求连接的一方。客户端的流程如下:

//1 运行一个客户进程,向服务器特定端口发送请求连接报文;
//2 等待并接收服务器的应答;
//3 继续提出请求;
//4 通信结束后关闭通信通道。

@2 server端:接受请求并且提供服务的一方。服务器端的流程如下:

//1 开启服务器进程;
//2 loop:等待并检测客户/下一个客户的连接请求;
//3     如果接收到客户的连接请求,则处理该请求;
//4     goto loop

3 用户数据报协议UDP(User Data Protocal)

3.1 用户数据报的格式

用户数据报UDP有两个字段:首部字段(用户数据报伪首部+用户数据报首部)和数据字段。

@1 用户数据报伪首部格式如图所示:

其中:

  • 源IP地址:占4个字节,用于标记发送端的IP地址。
  • 目的IP地址:占4个字节,用于标记接收端的IP地址。
  • 0:占1个字节,表示填充位。
  • 协议:占1个字节,UDP协议号为17。
  • UDP数据报长度:占2个字节。

@2 用户数据报首部如图所示:

其中:

  • 源端口号:用于标记数据报的源端口号。
  • 目的端口号:用于标记数据报的目的端口号。
  • UDP数据报的长度:包含数据报首部长度+数据部分长度。
  • 检验和字段:防止用户数据报在传输过程中出错。

注意:用户数据报伪首部是一个虚拟的数据结构,主要用在计算校验和时和UDP用户数据连接在一起,得到一个用于计算UDP用户数据报检验和的临时数据报。

3.2 用户数据报检验和计算

UDP数据报校验和一共计算两次,分别在发送端和接收端各进行一次。(这里用到了反码+源码=0x11111111...)

  1. 在发送端:将UDP数据报首部中的校验和字段设置为0;将伪首部以及UDP用户数据报看作是由多个16b的字符串连接起来,(如果用户数据报的数据部分不是偶数个字节,则要添加一个全0的字节,即最后一个16b是全0,这个16b指的是低位),按照二进制反码计算出这些16b的和;最后将这个数取反,这个结果就是发送数据报首部字节的校验和。
  2. 在接收端:将收到的UDP用户数据报连同伪首部(以及可能的填充全0字节)一起,按二进制反码求这些16bit字的和。 当无差错时其结果应全为1。否则就表明有差错出现, 接收端就应将此UDP用户数据报丢弃(也可以上交给应用层,但附上出现了差错的警告)。

3.3 UDP用户数据报的特性与用途

UDP用户数据报的特点:

  1. 面向无连接的协议,传输数据之前不建立连接。
  2. 不保证交付的可靠性,只是尽最大努力交付。

虽然UDP是一个不可靠的协议,但是在传输某些方面的数据时却又很大的优势,UDP的应用如下:

  1. 域名转换
  2. 链路协议
  3. 网络管理
  4. 远程文件服务
  5. IP电话

4 传输控制协议TCP(Transmission Control Protocal)

4.1 TCP简介

TCP是提供面向连接的服务,是可靠的全双工信道。与UDP相比,TCP协议较为复杂,但是同时也更加可靠,主要是由于面向连接且TCP对传输数据是进行编号和确认的。

4.2 TCP报文段的首部

TCP报文段也分为首部和数据两个部分,首部格式如图所示:

其中:

  • 源端口号:用于标记数据报的源端口号。
  • 目的端口号:用于标记数据报的目的端口号。
  • 序号:本报文段所发送的数据中第一个字节的序号。
  • 确认序号:下一个报文段数据的第一个字节的序号。
  • 数据偏移:占4个比特,偏移单位是4个字节,因此可以表示的最大偏移量是60字节。
  • 保留:值为0。
  • 6个比特位。
  • 窗口:用来控制对方发送的信息量,单位为字节,主要用在流量控制和拥塞控制中。
  • 校验和:校验和的方式与UDP一致,仅协议号不相同。
  • 任选项:用于处理一些特殊情况。目前被正式使用的选项字段可用于定义通信过程中的最大分组长度,只能在连接建立时使用。
  • 填充:用于填充TCP报文段,填充的内容必须为0;用于保证任选项为32b的整数倍。  

这里详细说明下6个比特位:

  1. 紧急比特URG:当URG为1时,表示报文中有紧急数据,应该尽快传送,而不是按照原来的排队顺序来传送。
  2. 确认比特ACK:在建立连接时使用;TCP数据包首部中的确认标志,对已接收到的TCP报文进行确认。
  3. 推送比特PSH:当PSH为1时,发送端会尽快将报文发送出去,而接收端在接收到推送比特为1的报文时,也会尽快从接收缓存中取出来交给应用进程。
  4. 复位比特RST:当RST为1时,表明TCP连接中出现了严重错误,必须释放连接,然后再重新建立连接。
  5. 同步比特SYN:在建立连接时用来同步序号。
  6. 终止比特FIN :用来释放一个连接。当FIN为1时,表明此报文段发送端的数据已经发送完毕,要求释放连接;FIN=0时无效。

4.3 TCP数据编号和确认

TCP之所以能够实现可靠的数据传输,是通过TCP数据标号与确认来实现的。

  1. TCP每次所发送的报文段的首部中序号的值就表示该报文段中数据部分的第一个字节序号(由于TCP报文段首部中序号占4个字节,所以能标志4G个字节的数据),对于一般的数据传输,能够保证每个字节的序号与其他字节的序号都不重复。
  2. TCP数据的确认:对已经成功接收的数据中最后一个字节的序号进行确认。
  3. 接收端返回的确认序号:该接收端期望下一次收到的数据中第一个字节序号的值(这个值应该等于已经正确接收到数据的最后一个字节的序号+1)。

发送序列与接收序列的关系如图所示:

4.4 TCP的流量控制与拥塞管理

TCP协议通常采用大小可变的滑动窗口进行流量控制。

  1. 发送窗口:在数据通信过程中发送端一次可以发送数据的最大字节数,在TCP报文段首部的窗口字段的值就是当前窗口的大小。
  2. 接收窗口:在数据通信过程中根据实际情况动态调整对方发送窗口的大小。

在TCP通信过程中,发送端要维护一个指针,该指针指向下一个即将被发送的数据。发送端每发送一个报文,指针就向前移动一个报文段的距离。发送窗口的移动是在发送端收到接收端的确认以后才进行的,发送端每次发送的报文段不大于发送窗口的大小。滑动窗口本质上是描述接收方的TCP数据报缓冲区的大小,发送方根据该数据来计算最多能发送多长的数据。如果发送方收到接收方的窗口大小为0的TCP数据报,则停止发送数据,直到等到接收方发送窗口大小不为0的数据报的到来。
可变窗口的流量控制:

  1. 通知窗口:接收端根据当时接收TCP报文段的能力而设定的窗口大小。
  2. 拥塞窗口:发送端根据网络的拥塞情况而设定的窗口大小。(拥塞窗口越大,可发送的数据量就越大)

一般情况下,发送窗口的值为MIN(通知窗口,拥塞窗口),在数据传输的过程中,可以通过改变窗口来进行流量的控制。(进行流量的控制既可以使接收端有充足的时间来接收和处理数据,还可以防止网络发生阻塞),利用可变窗口进行流量控制的过程如图所示:

4.5 TCP的运输连接管理

TCP建立连接的方法是三次握手、断开连接的方法是四次挥手,两种机制描述如下:

@1 三次握手流程如图所示:

流程说明如下:

  1. client发送一个SYN给server,然后等待server的回发确认信息。
  2. server发送一个SYN、ACK给客户端,确认已经收到客户端发来的信息。
  3. client接收到server发来的确认信息后,再回馈一个ACK给server,此时就可与server建立可靠的连接。

四次挥手:因为TCP/IP的连接是全双工的,所以每个方向都要单独进行关闭。四次挥手流程如图所示:
 

流程说明如下:

  1. client向server发送数据后,将FIN置1,告诉它我将要关闭这一方向上的数据连接。
  2. server接受到FIN后,关闭该方向上的数据的连接。将ACK置1,告诉client已经接收到client的信息并以处理。
  3. 同时server向client申请反方向上的数据连接的断开。将FIN置1。
  4. client接到server发来的申请,将ACK置1,双方同时关闭连接。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

图王大胜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值