传输层相关
一 TCP
1.1 TCP状态
- TCP连接的建立和终止
- 理解TCP的三次握手,四次挥手
TCP 为什么是三次握手,为什么不是两次或四次?关键在于序列号的同步 -
TCP发送RST场景:
- 一方为close,一方为established;
- 白名单黑名单限制连接;
-
TCP三次握手各种异常
Q:向一个不存在但合法的公网IP任意端口发送SYN包会出现什么情况?
A:返回ICMP主机不可达。
Q:向一个存在的IP但未绑定的端口发送SYN包会出现什么情况?
A:返回TCP RST segment。
Q: 第一个SYN包丢失了,客户主机(主动连接方)会采取什么动作?
A:重传,重试几次后(一般是3次)失败后,连接失败。
Q: 为什么连接建立的过程作3次TCP segment交互,而不是4次?
A:Server端的SYN&ACK在一个TCP segment传给了Client。
Q:什么情况下将会出现4次TCP segment交互?
A: 连接的两端同时打开。
Q: 第二个SYN2(就是图示中的SYN2+ACK1)丢失了,将出现什么情况?
A: Client收不到SYN2而不发送ACK2,Server端将超时重发。
Q: ACK2丢失了将会怎样?
A: Server端认为Client没收到SYN2+ACK1,重发SYN2+ACK1;另外连接处于未完成的状态,如果出现大量的ACK2丢失,未完成的连接队列会出现“满”的状态,从而不能再接收SYN1。这就是DOS。
1.2 TCP可靠性
- 通过序列号和确认应答提高可靠性,重传机制;
- 滑动窗口
- 流量控制
针对的是发送方和接收方速度不匹配的问题,流量控制是由接收方控制的,发送方始终是被迫调整至与接收方同步。 - 拥塞控制主要是四个算法:1)慢启动,2)拥塞避免,3)拥塞发生,4)快速恢复
- 流量控制
- 建立连接,三次握手四次挥手
1.3 TCP粘包与拆包
- 针对tcp是字节流协议,问:比如说发送方发了10个包,接收方要怎么知道包的个数呢?
- 使用固定长度的消息,报文长度不够的时候用无效数据填充。
- 使用换行字符来分割不同的报文。
- 把消息分为消息头和消息体两个部分,在消息头中添加消息长度的字段。
二 其他
-
端口
端口被分为三类:著名端口、监听端口和动态端口。- 著名端口:通常被用于系统进程。
这些端口一个显著特征就是限定在0~1023,并且在Linux/UNIX平台均需要 Root权限才能监听这些端口。
常见的著名端口有:FTP:21、SSH:22、SMTP:25、HTTP:80、HTTPS:443
等。 - 监听端口:用来运行各种用户自己写的服务,服务监听在这些端口下不需要特别的权限。
- 动态端口:动态端口通常被用来在主动发起连接时随机分配使用。
0~65535除去上述著名端口、监听端口两种端口号,剩下的端口都是备用的动态端口。
- 著名端口:通常被用于系统进程。
-
TCP与UDP的区别与适用场景
TCP:面向有连接的传输层协议,可以保证通信两端主机之间的通信可达;
可以正确的处理传输过程中丢包、传输乱序等异常情况;还能有效利用带宽,缓解网络拥堵。
UDP:面向无连接的传输层协议,不关注对端是否真的收到传送的数据;
如需检查对端是否收到分组数据包,或对端是否连接到网络,需要在应用程序中实现。
常用于分组数据较少或多播。广播通信及视频通信等领域。 -
TCP、UDP数据包大小的限制
UDP 包的大小就应该是 1500 - IP头(20) - UDP头(8) = 1472(Bytes)
TCP 包的大小就应该是 1500 - IP头(20) - TCP头(20) = 1460 (Bytes) -
为什么说TCP报文段是面向字节流的,UDP包是面向数据报的
问题的关键在于TCP是有缓冲区,作为对比,UDP面向报文段是没有缓冲区的。
TCP发送报文时,是将应用层数据写入TCP缓冲区中,然后由TCP协议来控制发送这里面的数据,而发送的状态是按字节流的方式发送的,跟应用层写下来的报文长度没有任何关系,所以说是流。
作为对比的UDP,它没有缓冲区,应用层写的报文数据会直接加包头交给网络层,由网络层负责分片,所以是面向报文段的。 -
如果要主动关闭连接,如何保证对方已经收到全部数据?
调用shutdown函数,先关闭写半连接,此时仍然保留读连接,直到read 返回0(表明对端已经发起关闭写连接),然后再关闭读半连接。(即下图的客户端)
image
顺便说一下,close和shutdown的区别。主要有两个:
- Close把描述符的引用计数减1,仅在该计数变为0时才关闭套接字。而使用shutdown可以不管引用计数就激发TCP的正常连接终止序列。
- Close终止读和写两个方向的数据传送。但有时候我们需要告知对端我们完成了数据发送,但对端仍有数据要发送给我们,这时就需要使用shutdown。
注意!套接字的半关闭指的是 关闭连接的写这一半。
网友评论