网络原理之TCP

TCP协议(TCP协议在传输层)

本文也会讲一些有关UDP协议的一些知识。

1 端口号

端口号(Port)标识了一个主机上进行通信的不同的应用程序
在TCP/IP协议中, 用 “源IP”, “源端口号”, “目的IP”, “目的端口号”, “协议号” 这样一个五元组来标识一个通信(可以通过netstat -n查看)

知名端口号(1-1023):FTP(21)/SSH(22)/HTTP(80)/HTTPS(443)/DNS(53)
操作系统动态分配的端口号(1024-65535):MySQL(3306)/TomCat(8080)
注意:我们自己在写端口号时,要避开这些知名端口号。

这里有两个问题:
1、一个进程可以bind多个端口号吗?
答:可以。
2、一个端口号可以被多个进程bind吗?
答:不可以。

2 UDP

1、UDP协议端格式
在这里插入图片描述

16位UDP长度, 表示整个数据报(UDP首部+UDP数据)的最大长度;
如果校验和出错, 就会直接丢弃;
校验和:是用来确定数据在传输过程中是否被篡改,用来判断数据的正确性。

2、UDP的特点
无连接: 知道对端的IP和端口号就直接进行传输, 不需要建立连接;
不稳定: 没有确认机制, 没有重传机制; 如果因为网络故障该段无法发到对方, UDP协议层也不
会给应用层返回任何错误信息;
面向数据报: 不能够灵活的控制读写数据的次数和数量;
UDP具有接受缓冲区,没有发送缓冲区

UDP的最大理论长度:64KB
那么这里就会有一个问题:
当超过最大理论长度要怎么办?
答:1.不处理,把它交给网络层处理,交给网络层存在丢包风险。
2.在应用层让程序去处理大包,把大包分为多个子包。

3、基于UDP的应用层协议
NFS: 网络文件系统
TFTP: 简单文件传输协议
DHCP: 动态主机配置协议
BOOTP: 启动协议(用于无盘设备启动)
DNS: 域名解析协议

3 TCP

1、TCP协议端格式
在这里插入图片描述

32位序号/32位确认号:消息的身份标识
4位TCP报头长度: 表示该TCP头部有多少个32位bit(4字节); 所以TCP头部最大长度是15 * 4 = 60
6位标志符:
URG: 紧急指针是否有效
ACK: 确认号是否有效
PSH: 提示接收端应用程序立刻从TCP缓冲区把数据读走
RST: 对方要求重新建立连接; 我们把携带RST标识的称为复位报文段
SYN: 请求建立连接; 我们把携带SYN标识的称为同步报文段
FIN: 通知对方, 本端要关闭了, 我们称携带FIN标识的为结束报文段

2、TCP的特点
有连接
稳定
面向数据流
TCP不仅有接受缓冲区,还有发送缓冲区。

4 TCP八大特性

1、确认应答机制(ACK)

可能存在的问题:
1、发送消息丢失
2、ACK丢失

2、超时重传机制

Linux默认超时时间:500ms
它的重传策略:
1、消息重传时间是以指数增长的
2、发送一定次数后,消息仍未得到应答,就会强制关闭,停止发送(对方可能下线)

3、连接管理

在正常情况下, TCP要经过三次握手建立连接, 四次挥手断开连接
1、三次握手(SYN/SYN+ACK/ACK):
验证客户端与服务器端的接受与发送能力
我用一个表格来具体表示:

在这里插入图片描述
这里就有问题了:
两次握手可以吗?
答:不可以,不能完整的证明客户端与服务器端的发送与接受能力。
四次握手可以吗?
答:当然可以,但是没有用啊,因为三次已经能够证明了。

2、四次挥手(FIN/ACK/FIN/ACK):
为了确保收发两端能够正常关闭。

这里有一个问题:
三次挥手可以吗?
答:有可能可以,接收缓冲区如果没有任务就可以。

4、滑动窗口

无需等待确认应答而可以继续发送数据。
提高了传输的效率。

窗口大小指的是无需等待确认应答而可以继续发送数据的最大值。
操作系统内核为了维护这个滑动窗口, 需要开辟 发送缓冲区 来记录当前还有哪些数据没有应
答; 只有确认应答过的数据, 才能从缓冲区删掉。
窗口越大, 则网络的吞吐率就越高。

5、流量控制

接收端处理数据的速度是有限的. 如果发送端发的太快, 导致接收端的缓冲区被打满, 这个时候如果发送端继续发送, 就会造成丢包, 继而引起丢包重传等等一系列连锁反应。
以接收缓冲区的大小的结果为导向。

具体步骤:
1、接收端将自己可以接收的缓冲区大小放入 TCP 首部中的 “窗口大小” 字段, 通过ACK端通知发送端;
2、窗口大小字段越大, 说明网络的吞吐量越高;
3、接收端一旦发现自己的缓冲区快满了, 就会将窗口大小设置成一个更小的值通知给发送端;
4、发送端接受到这个窗口之后, 就会减慢自己的发送速度;
5、如果接收端缓冲区满了, 就会将窗口置为0; 这时发送方不再发送数据, 但是需要定期发送一个窗口探测数据段, 使接收端把窗口大小告诉发送端。

6、拥塞控制

原理:TCP引入 慢启动 机制, 先发少量的数据, 探探路, 摸清当前的网络拥堵状态, 再决定按照多大的速度传输数据。
具体步骤:刚开始初始发送一个包,如果可以正常接收就会以指数增加发送的数据包的数量,一直增加到流量控制的最大值之后,就会从指数增长变成线性增长,一直进行收发,直到出现大量数据包丢失。
少量的丢包, 我们仅仅是触发超时重传; 大量的丢包, 我们就认为网络拥塞。

7、延迟应答

如果接收数据的主机立刻返回ACK应答, 这时候返回的窗口可能比较小, 窗口越大, 网络吞吐量就越大, 传输效率就越高. 我们的目标是在保证网络不拥塞的情况下尽量提高传输效率。
具体步骤:
1、数量限制: 每隔N个包就应答一次;
2、时间限制: 超过最大延迟时间就应答一次;

要特别注意的一点:延迟应答的时间一定要小于超时重传的时间,不能超过MSL,如果超过就会触发超时重传,会以为消息丢失了。

8、捎带应答

在延迟应答的基础上,提高消息传输的性能。

5 TCP面向数据流

由于TCP面向数据流,所以没有明确边界,可能会出现沾包和半包的情况。

沾包:
在这里插入图片描述
半包:
在这里插入图片描述
解决方案:
1.以“\n”作为明确的边界。
2.以固定大小作为边界。

6 TCP异常解决方案

可以挽救方式:重启电脑、关闭进程,会自动发送一次FIN,和正常关闭一样。
不可以挽救方式:机器掉电/网线断开:接收端认为连接还在,一旦接收端有写入操作,接收端发现连接已经不在了,就会进行reset,即使没有写入操作,TCP内置了保活定时器,会定期询问对方是否还在,如果对方不在,会直接把连接释放。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

宋丹尼尔

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

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

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

打赏作者

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

抵扣说明:

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

余额充值