计算机网络3–传输层2
文章目录
1 UDP和TCP的区别
UDP (User Datagram Protocol
)用户数据报协议
TCP(Transmission Control Protocol
)传输控制协议
UDP | TCP |
---|---|
无连接的 | 面向连接的 |
尽最大努力交付 | 可靠交付(无错、不丢、不重、按序) |
面向报文 | 面向字节流(报文进一步分解) |
没有拥塞控制 | 有拥塞、流量控制 |
n对n的交互通信 | 全双工通信(点对点连接的) |
首部开销小(8字节) | 首部20+字节 |
强调传输性能而不是传输的完整性 | 强调传输的完整性 |
比如视频传输 | 比如消息收发 |
2 TCP三次握手四次挥手
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iind19GZ-1600135131334)(en-resource://database/1888:1)]
1)3次握手为什么不能是2次或者4次?
(1)3次握手确认了服务器和客户端的收发情况都正常。
(2)2次握手:假如SYN+ACK没有收到,则会出现服务器一直等待的情况。4次握手过于多余。
2)为什么握手3次,而挥手需要4次?
握手过程建立时,还没有建立起连接,SYN和ACK可以一块发,节省一次。建立连接后,TCP是双向的,不能单向断开连接。所以需要左右两个方向分别断开连接,两对FIN和ACK就是4次
3)3次握手时最后一个ACK丢了怎么办?
-
服务端
(1)按照一定时间间隔进行超时重传,比如等待3秒、6秒、12秒后重新发送SYN+ACK包,以便Client重新发送ACK包。
(2)当重发次数超过了设定值(默认为5),则关闭连接 -
客户端
connect函数实现和服务端的连接,当服务端返回SYN+ACK报文,则成功返回,连接状态为ESTABLISHED。如果此时发送到服务器端的ACK丢失,则向服务端发送消息,服务端会返回RST,进而使得客户端感知到未连接。
4) TCP三次握手时的SYN队列和ACCEPT队列是什么?
(1)SYNS队列:用于保存半连接状态(SYN_RCVD)的请求,其大小通过/proc/sys/net/ipv4/tcp_max_syn_backlog指定,一般默认值是512
(2)ACCEPT队列:用于保存全连接状态(ESTABLISHED)的请求(注意:处理完ACK后就会从队列退出),其大小通过/proc/sys/net/core/somaxconn指定,在使用listen函数时,内核会根据传入的backlog参数与系统参数somaxconn,取二者的较小值。如果accpet queue队列满了,server将发送一个ECONNREFUSED错误信息Connection refused到client。调用accept函数后,请求会退出ACCEPT队列。
5) 什么是SYN攻击,如何提高峰值连接的能力?
疯狂发送连接,SYNS QUEUE充满。调大两个QUEUE可提高峰值连接的能力。
6)TCP四次挥手过程中的CLOSE_WAIT过多是为什么?怎么解决?
CLOSE_WAIT是服务器在接受到客户端的FIN后处于的状态,说明服务器没有进入LAST_ACK,也就是一直忙于读写,没有发送FIN给客户端(对应为socket的close())。
解决方案:
- 检测,确定是代码原因还是服务器能力原因。
- 代码层面(代码原因):用完socket需要尽快close()
- 业务层面(服务器能力原因):限制连接数
- 运维层面(服务器能力原因):增大集群的规模,提高数据处理和收发能力
7)TCP四次挥手过程中的TIME_WAIT过多是为什么?怎么解决?
TIME_WAIT是客户端在接受到服务器的FIN后返回ACK,等待2MSL时间所处于的状态。
解决方案:配置服务器参数:
- 开启重用,允许将TIME-WAIT sockets重新用于新的TCP连接:
net.ipv4.tcp_tw_reuse = 1
.默认为0,表示关闭. - 开启TCP连接中TIME-WAIT sockets的快速回收:
net.ipv4.tcp_tw_recycle = 1
.默认为0,表示关闭. - 调小表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。
net.ipv4.tcp_max_tw_buckets = 5000
- 加大表示SYN队列的长度,使其可以容纳更多等待连接的网络连接数:
net.ipv4.tcp_max_syn_backlog = 8192
.默认为1024. - 增大表示用于向外连接的端口范围。
net.ipv4.ip_local_port_range = 1024 65000
.缺省情况下很小:32768到61000,改为1024到65000。
3 TCP为什么可靠
-
确认和重传机制
建立连接时三次握手同步双方的“序列号 + 确认号 + 窗口大小信息”,是确认重传、流控的基础传输过程中,
如果Checksum校验失败、丢包或延时,发送端重传。- 数据丢失或延迟。发送方发送数据seq时会起一个定时器,如果在指定时间内没有接收到ACK seq + 1,就把数据seq再发一次。
- 数据乱序。 接收方上一个收到的正确数据是seq + 4,它返回seq + 5作为ACK。这时候它收到了seq + 7,因为顺序错了,所以接收方会再次返回seq + 5给发送方。
- 数据错误。每一个TCP数据都会带着数据的校验和。接收方收到数据seq + 3以后会先对校验和进行验证。如果结果不对,则发送ACK seq + 3,让发送方重新发送数据。
- 数据重复。接收方直接丢弃重复的数据即可。
-
数据排序
TCP有专门的序列号SN字段,可提供数据re-order -
流量控制
滑动窗口和计时器的使用。TCP窗口中会指明双方能够发送接收的最大数据量,发送方通过维持一个发送滑动窗口来确保不会发生由于发送方报文发送太快接收方无法及时处理的问题。 -
拥塞控制
TCP的拥塞控制由4个核心算法组成:“慢启动”(Slow Start)“拥塞避免”(Congestion avoidance)“快速重传 ”(Fast Retransmit)“快速恢复”(Fast Recovery)
端口号
- 端口号的作用是什么?
TCP和UDP使用16位的端口号来识别不同的应用程序。TCP/IP实现所提供的服务都使用1-1023之间的端口号(所谓的知名端口号),我们的应用不可以占用。
还记得计算机网络课程中,我们创建应用的时候,都需要绑定(bind函数)端口吗?记得前面问题中的DNS(UDP 53端口)、SMTP(简单邮件传输协议,25端口)吗?默认绑定了端口哦。
- 什么是知名端口号?范围是多少?举几个例子?
已经默认分配的端口,范围为1-1023(很好记,0-1023除掉0),比如http的80端口,FTP的20端口等
TCP首部包含哪些参数?[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8jEi9w0y-1600135131337)(en-resource://database/1890:1)]
-
16位源端口号和16位目的端口号。
-
32位序号:一次TCP通信过程中某一个传输方向上的字节流的每个字节的编号,通过这个来确认发送的数据有序,比如现在序列号为1000,发送了1000,下一个序列号就是2000。
-
32位确认号:用来响应TCP报文段,给收到的TCP报文段的序号加1,三握时还要携带自己的序号。
-
4位头部长度:标识该TCP头部有多少个4字节,共表示最长15* 4=60字节。同IP头部。
-
6位保留。6位标志。
- URG(紧急指针是否有效)
- ACK(表示确认号是否有效)
- PSH(接收端应用程序应立即从TCP接收缓冲区读走数据)
- RST(表示要求对方重新建立连接)
- SYN(表示请求建立一个连接)
- FIN(表示通知对方本端要关闭连接)
-
16位窗口大小:TCP流量控制的一个手段,用来告诉对端TCP缓冲区还能容纳多少字节。16位校验和:由发送端填充,接收端对报文段执行CRC算法以检验TCP报文段在传输中是否损坏。
-
16位紧急指针:一个正的偏移量,它和序号段的值相加表示最后一个紧急数据的下一字节的序号。 URG:紧急指针有效ACK:确认序号有效PSH:接收方应该尽快将这个报文段交给应用层RST:重建连接,比如向未监听的端口发送数据,就会返回RSTSYN:同步序号用来发起一个连接FIN:发端完成发送任务