1、http协议内容
image.png2、TCP具体是通过怎样的方式来保证数据的顺序化传输呢?
- 主机每次发送数据时,TCP就给每个数据包分配一个序列号并且在一个特定的时间内等待接收主机对分配的这个序列号进行确认,
- 如果发送主机在一个特定时间内没有收到接收主机的确认,则发送主机会重传此数据包。
- 接收主机利用序列号对接收的数据进行确认,以便检测对方发送的数据是否有丢失或者乱序等,
- 接收主机一旦收到已经顺序化的数据,它就将这些数据按正确的顺序重组成数据流并传递到高层进行处理。
3、TCP协议规定2MSL等待的原因
MSL(最大报文存活时间)
1、保证TCP协议的全双工连接能够可靠关闭
2、保证这次连接的重复数据段从网络中消失
4、IO的read()/write()为什么阻塞
读写socket通过inputstream和outputstream实现,而文件读写,虚拟机根本做不了,最终还是通过JVM委托给操作系统,所以当前线程除了阻塞等待直到读取数据,啥也干不了。
5、TCP Keepalive
作用
- 探测连接的对端是否存活
- 防止中间设备因超时删除连接相关的连接表
定义一个时间段,在这个时间段内,如果没有任何连接相关的活动,TCP 保活机制会开始作用,每隔一个时间间隔,发送一个探测报文,该探测报文包含的数据非常少,如果连续几个探测报文都没有得到响应,则认为当前的 TCP 连接已经死亡,系统内核将错误信息通知给上层应用程序
上述的可定义变量,分别被称为保活时间、保活时间间隔和保活探测次数,默认设置是 7200 秒(2 小时)、75 秒和 9 次探测。
如果开启了 TCP 保活,需要考虑以下几种情况:
- 第一种,对端程序是正常工作的。当 TCP 保活的探测报文发送给对端, 对端会正常响应,这样 TCP 保活时间会被重置,等待下一个 TCP 保活时间的到来。
- 第二种,对端程序崩溃并重启。当 TCP 保活的探测报文发送给对端后,对端是可以响应的,但由于没有该连接的有效信息,会产生一个 RST 报文,这样很快就会发现 TCP 连接已经被重置。
- 第三种,是对端程序崩溃,或对端由于其他原因导致报文不可达。当 TCP 保活的探测报文发送给对端后,石沉大海,没有响应,连续几次,达到保活探测次数后,TCP 会报告该 TCP 连接已经死亡。
问题:
- 在短暂的故障期间,Keepalive设置不合理时可能会因为短暂的网络波动而断开健康的TCP连接
- 需要消耗额外的宽带和流量
- 在以流量计费的互联网环境中增加了费用开销
HTTP协议的Keep-Alive意图在于TCP连接复用,同一个连接上串行方式传递请求-响应数据;TCP的Keepalive机制意图在于探测连接的对端是否存活。
6、syn洪水攻击
在S返回一个确认的SYN-ACK包的时候,S可能由于各种原因不会接到C回应的ACK包。这个也就是所谓的半开放连接,S需要 耗费一定的数量的系统内存来等待这个未决的连接,虽然这个数量是受限,但是恶意者可以通过创建很多的半开放式连接来发动SYN洪水攻击 。
7、TCP_NODELAY与Nagle算法
传统的传输模式很容易将窄窄的带宽挤满而丢包,再重传、再丢包的恶性循环。
于是Nagle算法通过先把数据缓存起来再一起发送,减少需要传输的数据包,提高效率,唯一的不足是,可能会有一些延迟。
启动TCP_NODELAY,就意味着禁用了Nagle算法,允许小包的发送,数据传输非常少,延时较低。
8、为什么udp不会粘包
- TCP协议是面向流的协议,UDP是面向消息的协议
- UDP段都是一条消息,应用程序必须以消息为单位提取数据,不能一次提取任意字节的数据
- UDP具有保护消息边界,在每个UDP包中就有了消息头(消息来源地址,端口等信息)
9、同一个IP同一个端口可以同时建立tcp和udp的连接吗?
可以,同一个端口虽然udp和tcp的端口数字是一样的,但实质他们是不同的端口,所以是没有影响的,从底层实质分析,对于每一个连接内核维护了一个五元组,包含了源ip,目的ip、源端口目的端口、以及传输协议,在这里尽管前4项都一样,但是传输协议是不一样的,所以内核会认为是2个不同的连接,在ip层就会进行开始分流,tcp的走tcp,udp走udp。
网友评论