网络-------TCP/UDP

五元组:源IP \ 源端口 \ 目的IP \ 目的端口 \ 协议号
端口号(标识应用程序):
Windows查看端口号:
nestat - ano | findstr “想查打的端口号” 会显示进程的pid

Linux查看端口:
nestat - ano | grep “想查打的端口号” 会显示进程的pid
端口号范围划分
0 - 1023: 知名端口号, HTTP, FTP, SSH等这些广为使用的应用层协议, 他们的端口号都是固定的.
1024 - 65535: 操作系统动态分配的端口号. 客户端程序的端口号, 就是由操作系统从这个范围分配的.

一个进程可以绑定多个端口号
一个端口号不可以被多个进程绑定

使用固定大小线程池,会导致线程不够用

传输层UDP协议:
1.16位UDP长度, 表示整个数据报(UDP首部+UDP数据)的最大长度;
2.16位UDP检验和如果校验和出错, 就会直接丢弃;

UDP的特点:
1.无连接: 知道对端的IP和端口号就直接进行传输, 不需要建立连接;
2.不可靠: 没有确认机制, 没有重传机制; 如果因为网络故障该段无法发到对方, UDP协议层也不会给应用层返回任何错误信息;
3.面向数据报:能够灵活的控制读写数据的次数和数量;
4.具有接收缓冲区,没有发送缓冲区
UDP能传输的数据最大长度是64K(包含UDP首部).
在这里插入图片描述

应用层交给UDP多长的报文, UDP原样发送, 既不会拆分, 也不会合并;

用UDP传输100个字节的数据:
如果发送端调用一次sendto, 发送100个字节, 那么接收端也必须调用对应的一次recvfrom, 接收100个字节; 而不能循环调用10次recvfrom, 每次接收10个字节;

UDP的缓冲区:
UDP没有发送缓冲区. 调用sendto会直接交给内核, 由内核将数据传给网络层协议进行后续的传输动作;
UDP具有接收缓冲区. 但是这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一致; 如果缓冲区满了, 再到达的UDP数据就会被丢弃;

UDP协议首部中有一个16位的最大长度. 也就是说一个UDP能传输的数据最大长度是64K(包含UDP首部).然而64K在当今的互联网环境下, 是一个非常小的数字.
如果我们需要传输的数据超过64K, 就需要在应用层手动的分包, 多次发送, 并在接收端手动拼装;

TCP协议
TCP全称为 “传输控制协议(Transmission Control Protocol”).

保证可靠性:
确认应答:发送数据包携带序号,响应数据包携带确认序号,发送端可以知道那些数据是接收到的

超时重传机制:
1.超过一定时间,表示数据丢包,需要重发------依赖发送缓冲区来重发(系统内存中有进程基于TCP的发送缓冲区,系统可以重发)
2.超时时间的确定:
在固定的网络环境下,单次数据包发送的最大时间也比较固定,有2次数据包(发送+响应),总的超时时间就应该是单次最大时间*2
单次数据传输的最大时间,在不同的网络情况下,是动态变化的

丢包:
1.主机A发送数据给B之后, 可能因为网络拥堵等原因, 数据无法到达主机B;
如果主机A在一个特定时间间隔内没有收到B发来的确认应答, 就会进行重发;

2.主机A未收到B发来的确认应答, 也可能是因为ACK丢失了;
此主机B会收到很多重复数据. 那么TCP协议需要能够识别出那些包是重复的包, 并且把重复的丢弃掉. 这时候我们可以利用前面提到的序列号, 就可以很容易做到去重的效果.

连接管理机制:
TCP要经过三次握手建立连接:
建立连接:每一端保存自己的连接状态(通过自己发送SYN建立连接数据包,接收ACK响应数据包,才会产生)
流程:假如A建立到B的连接
(1)创建A —>B的连接:发送A的SYN到B
(2)B响应ACK,还需要创建B ---->A的连接,携带B的SYN返回给A
(3)A接收到响应数据包,A---->B的连接建立成功,同时响应建立B----->A的连接的请求:返回ACK
在这里插入图片描述

四次挥手断开连接
在这里插入图片描述
流程:
断开A---->B的连接:
(1)A发送 FIN 关闭连接的请求到B
(2)B响应 ACK 给A
断开B---->A的连接:
(3)B发送 FIN 关闭连接的请求到A
(4)A响应 ACK 给B

(2)和(3)不能合并的原因
(2)属于系统自动响应包
(3)程序手动调用 close() 发送关闭连接的数据包

TIME_WAIT的时间是2MSL
CLOSE_WAIT
一般而言,对于服务器上出现大量的 CLOSE_WAIT 状态, 原因就是服务器没有正确的关闭 socket, 导致四次挥手没有正确完成. 这是一个 BUG. 只需要加上对应的 close 即可解决问题.

滑动窗口:
在这里插入图片描述
窗口大小指的是无需等待确认应答而可以继续发送数据的最大值. 上图的窗口大小就是4000个字节(四个段).(有发送端阻塞窗口和接收端流量控制窗口决定)
分情况讨论:
(1)先接收到ACK下一个1001:窗口向下滑动一位,窗口范围有14000变为10015000;
(2)接收到4个数据包的ACK:窗口变为4001-8000
(3)先接收到ACK下一个2001:窗口不能滑动

ACK发送的下一个序号是多少,决定了发送端下一个数据包发送的位置,并且接收端在该序号前的得数据包必须已经都接收到.

丢包情况:
在这里插入图片描述
如果1001-2000这段数据发生如图所示的丢包,此时不会有影响,因为当1001-2000这段数据在应答时丢包,当2001-3000这段代码应答成功时,就说明数据包发送完成.相当于帮助第一段数据包应答
在这里相当于,只要5001-6000的数据包能够应答(响应)回去,其他的响应(应答)丢包都没事

情况二
在这里插入图片描述

在这里插入图片描述
发生如图所示的丢包时,由于1001-2000的数据包在发送时丢包,所以接收端一直没有接收到1001-2000的数据包,那么在响应时就会告诉主机A,它没有收到,它会在接下来三次重复告诉主机他没有收到,在三次之后,主机A就会再次发送1001-2000的数据包,在这过程中接收端还是会继续响应下一个是1001-2000,直到1001-2000数据包被B接收,然后B响应下面的数据包.
再整个过程中,其他的并行发送的数据包依然在发送,B在响应时也会带上本次数据发送的序列号给主机A.也就是说虽然1001-2000数据包没有发送成功,需要重新发送,但是它并没有影响这个窗口中其他数据的发送.
(2001 - 7000)接收端其实之前就已经收到了, 被放到了接收端操作系统内核的接收缓冲区中;

流量控制:
接收端处理数据的速度是有限的. 如果发送端发的太快, 导致接收端的缓冲区被打满, 这个时候如果发送端继续发送, 就会造成丢包, 继而引起丢包重传等等一系列连锁反应.
因此TCP支持根据接收端的处理能力, 来决定发送端的发送速度. 这个机制就叫做流量控制(Flow Control);

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

拥塞控制:
虽然TCP有了滑动窗口这个大杀器, 能够高效可靠的发送大量的数据. 但是如果在刚开始阶段就发送大量的数据, 仍然可能引发问题.
因为网络上有很多的计算机, 可能当前的网络状态就已经比较拥堵. 在不清楚当前网络状态下, 贸然发送大量的数据, 是很有可能引发问题.

TCP引入 慢启动 机制, 先发少量的数据, 探探路, 摸清当前的网络拥堵状态, 再决定按照多大的速度传输数据;
在这里插入图片描述

此处引入一个概念程为拥塞窗口
在这里插入图片描述
当TCP开始启动的时候, 慢启动阈值等于窗口最大值;
在每次超时重发的时候, 慢启动阈值会变成原来的一半, 同时拥塞窗口置回1;
少量的丢包, 我们仅仅是触发超时重传; 大量的丢包, 我们就认为网络拥塞; 当TCP通信开始后, 网络吞吐量会逐渐上升; 随着网络发生拥堵, 吞吐量会立刻下降;
拥塞控制, 归根结底是TCP协议想尽可能快的把数据传输给对方, 但是又要避免给网络造成太大压力的折中方案.

延迟应答:(接收端接收到数据包,不用立即返回ack,稍等一段时间,让进程有时间处理缓冲区数据,这样返回的ack数据包中,窗口大小字段可以设置为更大---->(接收端)流量控机制 —> (发送端)滑动窗口大小)
假如接收缓冲区的大小为1M,一次收到500k的数据,如果此时立即应答,则返回的的窗口大小为500k,
如果应答能够稍微延迟一会儿,同时又赶上这500k的数据处理的非常快,那么空间很快又被释放出来,此时返回的窗口大小为又为1M.

窗口越大, 网络吞吐量就越大, 传输效率就越高. 我们的目标是在保证网络不拥塞的情况下尽量提高传输效率,应用延迟应答可以提高效率.

那么所有的包都可以延迟应答么? 肯定也不是;
数量限制: 每隔N个包就应答一次;
时间限制: 超过最大延迟时间就应答一次;
具体的数量和超时时间, 依操作系统不同也有差异; 一般N取2, 超时时间取200ms;

捎带应答:
有些数据包是可以合并的,

TCP得特点:
(1)可靠的:提供了一系列机制保证:
(2)效率:由…保证(没有UDP)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值