Linux网络基础一:TCP与UDP

一、传输控制协议TCP概述

传输控制协议TCP(Transmission Control Protocol)。在传输数据之前必须先建立连接,数据传输后要释放连接。TCP不提供广播或者多播服务。由于TCP要提供可靠的、面向连接的运输服务,因此不可避免的要增大开销,如确认、流量控制、计时器以及连接管理等。不仅使协议数据单元首部增大很多,还要占用处理资源。

1、TCP的主要特点
(1)TCP是面向连接的传输层协议。即建立TCP,必须进行TCP连接,完成后,释放连接。

在这里插入图片描述
TCP三次握手,创立连接的过程:

1、假设主机A运行TCP客户程序,B运行TCP服务器程序,最初进程状态都处于CLOSED状态。假设A主动打开连接,B被动打开连接。
2、B服务器程序准备接受客户进程连接请求,则进入LISTEN状态,等待客户的连接请求。
3、主机A准备建立连接时,向B发出请求报文段,携带这些信息:同部位SYN=1,同时选择一个初始序号seq=x。这时主机A进入SYN-SENT状态。

主机B收到请求报文段后,如同意建立连接,则向A发送确认。在确认报文中,把SYN和ACK都置为1,确认号ack=x+1,同时为自己选择一个初始序列号seq=y,这时,TCP服务器B主机进入SYN-RCVD状态。

4、TCP客户端收到B的确认后,还要再向B确认。此时,确认报文ACK置为1,确认号ack=y+1,自己的序号seq=x+1,此时,TCP已经建立连接,A进入ESTABLISHED状态。
当B收到A的确认后,也进入ESTABLISHED状态。

在这里插入图片描述
TCP四次挥手,释放连接的过程:

1、A向其TCP发出连接释放的报文,并停止发送数据,A把释放报文首部的终止控制位FIN置为1,其序号seq=u,这时A进入FIN-WAIT-1状态,等待B确认。

B收到报文后即发出确认,确认序号是ack=u+1,而自己的序号是v,随机B进入CLOSED-WAIT状态。此时TCP连接处于半关闭的状态,即A已经没有数据要发送,但B若发送数据,A仍要接收,也就是说B到A的这个方向连接并未关闭,会持续一段时间,

2、A收到来自B的确认后,进入FIN-WAIT-2状态,等待B发出连接释放的报文。

若B已经没有要向A发送的数据,其应用程序就通知TCP释放连接。B发出的连接释放FIN=1,假定B的序号为w,(在关闭状态B可能又发送了一些数据),B必须重复上次已经发送过得确认号ack=u+1,这时B进入LAST-ACK状态。

3、A在收到B的连接释放报文后,必须对此发出确认。确认报文中ACK=1,确认号ack=w+1,而自己的序号seq=u+1,然后进去TIME-WAIT状态。此时,连接还没有释放掉,必须经过时间等待计时器设置的时间2MSL后,A才会进入CLOSED状态。

时间MSL叫做最长报文寿命。

4、B只要收到A发出的确认,就进入CLOSED状态。
(2)可靠传输的实现

1、滑动窗口机制

  • 窗口大小指的是无需等待确认应答而可以继续发送数据的最大值。
  • 发送窗口内字段的时候, 不需要等待任何ACK, 直接发送。
  • 收到第一个ACK后, 滑动窗口向后移动, 继续发送下一个窗口字段的数据; 依次类推。
  • 操作系统内核为了维护这个滑动窗口, 需要开辟发送缓冲区来记录当前还有哪些数据没有应答; 只有确认应答过的数据, 才能从缓冲区删掉。
  • 窗口越大, 则网络的吞吐率就越高。

2、 确认应答机制&序列号

TCP将每个字节的数据都进行了编号,即为序列号。
每一个ACK都带有对应的确认序列号,意思是告诉发送者,我已经收到了哪些数据;;下一次你从哪里开始发。

3、超时重传&序列号

主机A发送数据给B之后, 可能因为网络拥堵等原因, 数据无法到达主机B; 如果主机A在一个特定时间间隔内没有收到B发来的确认应答, 就会进行重发;
主机A未收到B发来的确认应答,也可能是因为ACK丢失了,因此主机B会收到很多重复数据.。那么TCP协议需要能够识别出那些包是重复的包,,并且把重复的丢弃掉.,这时候我们可以利用序列号, 就可以很容易做到去重的效果。

4、拥塞控制

每次发送数据包的时候, 将拥塞窗口和接收端主机反馈的窗口大小做比较, 取较小的值作为实际发送的窗口。
拥塞控制, 归根结底是TCP协议想尽可能快的把数据传输给对方, 但是又要避免给网络造成太大压力的折中方案。

(3)面向字节流

创建一个TCP的socket, 同时在内核中创建一个发送缓冲区和一个接收缓冲区;
另一方面, TCP的一个连接, 既有发送缓冲区, 也有接收缓冲区, 那么对于这一个连接, 既可以读数据, 也可以写数据. 这个概念叫做 全双工 。

1、调用write时, 数据会先写入发送缓冲区中;
2、如果发送的字节数太长, 会被拆分成多个TCP的数据包发出; 如果发送的字节数太短, 就会先在缓冲区里等待, 等到缓冲区长度差不多了, 或者其他合适的时机发送出去;
3、接收数据的时候, 数据也是从网卡驱动程序到达内核的接收缓冲区;
4、然后应用程序可以调用read从接收缓冲区拿数据;

2、TCP的报文格式

在这里插入图片描述
TCP的首部的最小的长度是20字节。
(1)源端口和目的端口。各占2个字节。
(2)序号。占4字节,在TCP连接中传输的字节流中每一个字节都按照顺序编号。
(3)确认号。占4字节,是期望收到对方下一个报文的第一个数据字节的序号。
(4)数据偏移。占4位,由于首部中还有长度不确定的选项字段,因此需要数据偏移字段。数据偏移的单位是32位,最大值是60字节,这也是TCP首部的最大长度
(5)保留。占6位,保留为今后使用。
(6)紧急URG。

这部分我是看书总结的,时间来不及了,先写到这,后续再补充。

二、传输控制协议UDP概述

用户数据报协议UDP(User Datagram Protocol)。UDP在传送数据之前不需要建立连接。虽然UDP提供不可靠交付,但在某些情况下UDP却是一种最有效的工作方式。

1、UDP的主要特点

(1)UDP是面向无连接的。即发送数据之前不需要建立连接。
(2)UDP是尽最大努力交付,即不保证可靠交付。
(3)UDP是面向报文的。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。
(4)UDP没有拥塞控制。
(5)UDP支持一对一,一对多,多对一和多对多的交互通信。
(6)UDP的首部开销小,只有8个字节。

2、UDP的报文格式

在这里插入图片描述
UDP的报文格式只分为两部分,数据字段和首部字段。首部字段只有8个字节。
(1)源端口。源端口号,在需要对方回信时选用,不需要时可用全0。
(2)目的端口。目的端口,在终点交付时必须使用。
(3)长度。UDP用户数据报的长度,最小值是8(没有数据部分)。
(4)校验和。检测UDP用户数据在传输中是否有错,有错就丢弃。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值