TCP/IP学习笔记!
TCP/IP 协议是传输层的一个面向连接的安全可靠的一个传输协议。
1)TCP报文段:
TCP报文段首部的前20个字节是固定的,后面有 4n 字节是根据需要而增加的。 因此TCP首部的最小长度是20字节。
2)TCP建立连接(三次握手)
三次握手的机制是为了保证能建立一个安全可靠的连接,那么第一次握手是由客户端发起,客户端会向服务端发送一个报文,在报文里面:SYN标志位置为1,表示发起新的连接。当服务端收到这个报文之后就知道客户端要和我建立一个新的连接,于是服务端就向客户端发送一个确认消息包,在这个消息包里面:ack标志位置为1,表示确认客户端发起的第一次连接请求。以上两次握手之后,对于客户端而言:已经明确了我既能给服务端成功发消息,也能成功收到服务端的响应。但是对于服务端而言:两次握手是不够的,因为到目前为止,服务端只知道一件事,客户端发给我的消息我能收到,但是我响应给客户端的消息,客户端能不能收到我是不知道的。所以,还需要进行第三次握手,第三次握手就是当客户端收到服务端发送的确认响应报文之后,还要继续去给服务端进行回应,也是一个ack标志位置1的确认消息。通过以上三次连接,不管是客户端还是服务端,都知道我既能给对方发送消息,也能收到对方的响应。那么,这个连接就被安全的建了。
3)TCP释放连接
四次挥手:由客户端首先发起的,第一次挥手客户端会发送一个报文,在报文里面FIN标志位置1,当服务端收到这个报文就知道了客户端想要和我断开连接,但是此时服务端不一定能做好准备,因为当客户端发起断开连接的请求后,对于服务端而言还极有可能有未发送完的消息,还需继续发送,所以此时对于服务端而言只能进行一个消息确认(第二次挥手),即告诉客户端我知道你要和我断开连接,但是我这边还可能没有做好准备,你需要等我一下,等会儿我会告诉你(第三次挥手),于是,发完这个消息确认包过后,可能稍过片刻,服务端会继续发送一个断开连接的报文(第三次挥手),FIN位置1的报文,表示服务端已经做好断开连接的准备,当这个报文发给客户端的时候,客户端同样要给服务端发送一个消息确认的报文(第四次挥手),经过这四次的相互沟通和连接,我就知道了不管是客户端还是服务端都已经做好了断开连接的准备,于是连接断开了。
4)面试常见问题
1.为什么TCP握手需要三次,两次行不行?
答:不行。TCP进行可靠传输的关键就在于维护一个序列号,三次握手的过程即是通信双方相互告知序列号 起始值, 并确认对方已经收到了序列号起始值。
如果只是两次握手, 至多只有客户端的起始序列号能被确认, 服务器端的序列号则得不到确认
2.为什么TCP挥手需要4次?
答:主要原因是当服务端收到客户端的 FIN 数据包后,服务端可能还有数据没发完,不会立即close。
所以服务端会先将 ACK 发过去告诉客户端我收到你的断开请求了,但请再给我一点时间,这段时间用 来发送剩下的数据报文,发完之后再将 FIN 包发给客户端表示现在可以断了。
之后客户端需要收到 FIN 包后发送 ACK 确认断开信息给服务端。
3.为什么四次挥手释放连接时需要等待2MSL?
答:MSL即报文最大生存时间。设置2MSL可以保证上一次连接的报文已经在网络中消失,不会出现与新TCP连接报文冲突的情况。
4.TCP与UDP区别?
答:TCP作为面向流的协议,提供可靠的、面向连接的运输服务,并且提供点对点通信,
UDP作为面向报文的协议,不提供可靠交付,并且不需要连接,不仅仅对点对点,也支持多播和广播。
5.为何TCP可靠,UDP不可靠?
答:TCP有三次握手建立连接,四次挥手关闭连接的机制。除此之外还有滑动窗口和拥塞控制算法。最最关键的是还保留超时重传的机制。对于每份报文也存在校验,保证每份报文可靠性。
而UDP面向数据报无连接的,数据报发出去,就不保留数据备份了。仅仅在IP数据报头部加入校验和复用。UDP没有服务器和客户端的概念。UDP报文过长的话是交给IP切成小段,如果某段报废报文就废了。
6.简述SYN攻击?
答:SYN攻击即利用TCP协议缺陷,通过发送大量的半连接请求,占用半连接队列,耗费CPU和内存资源。
优化方式:(1)缩短SYN Timeout时间。
(2)记录IP,若连续受到某个IP的重复SYN报文,从这个IP地址来的包会被一概丢弃。
7.为什么连接的时候是三次握手,断开的时候是四次挥手?
答:因为连接的时候,服务器收到客户端的SYN连接报文后可以直接发送SYN+ACK报文(其中SYN报文是用来同步的,ACK报文是用来应答的);
但是,断开的时候,服务器收到客户端的FIN报文后并不会立即关闭SOCKET,而是先回复一个ACK报文,告诉客户端“我收到你发的FIN报文了”,直到服务器的所有报文都发送完了,才发送FIN报文,因此不会一起发送FIN+ACK。故需要四步握手。