自己先不整理,贴两个链接参考:
注意:别把IP协议和IP地址搞混了。TCP/IP中的IP是Internet Protocol(网际协议),位于网络层。IP 协议的作用是把各种数据包传送给对方。而要保证确实传送到对方那里,则需要满足各类条件。其中两个重要的条件是 IP 地址和 MAC地址(Media Access Control Address)。IP地址指明了节点被分配到的地址,MAC 地址是指网卡所属的固定地址。
TCP报文主要标志位的含义:
- seq(序号): 表示发送的数据字节流,为了确保TCP传输有序,对每个字节进行编号。
- ack(确认序号): 发送方期待接收的下一序列号,接收成功后的数据字节序列号加 1。 只有ACK=1时才有效。
- ACK: 确认序号的标志,ACK=1表示确认序号有效,ACK=0表示报文不含确认序号信息。
- SYN: 连接请求序号标志,用于建立连接,SYN=1表示请求连接。
- FIN: 结束标志,用于释放连接,为1表示关闭本方数据流.
所以:建立连接是 SYN和ACK,另外是seq和ack; 断开连接是 FIN和ACK,另外是seq和ack
三次握手
四次挥手
问题
1,为什么要三次握手?两次不行么?为什么?
三次握手的目的是建立可靠的通信信道,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。
一方面从下面三点回答:
* 第一次握手:Client 什么都不能确认;Server 确认了对方发送正常
* 第二次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:自己接收正常,对方发送正常
* 第三次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:自己发送、接收正常,对方发送接收正常
所以三次握手就能确认双发收发功能都正常,缺一不可。
为了防止已经失效的连接请求报文突然又传送到了服务器,从而不必要的错误。可以假设这样一种场景,客户端发送的第一个请求连接没有丢失,而是延迟到达,
由于TCP的客户端在超时时间内没有收到服务器的确认报文,以为服务器没有收到,此时会重新向服务器发送这条报文,这时客户端和服务器在经过两次握手完
成连接并传输数据后关闭了连接。然后之前滞留的那一次请求连接,因为网络通畅到达了服务器,这个报文本该是失效的,但是,两次握手的机制将会让客户端
和服务器再次建立连接,这将导致不必要的错误和资源浪费。
2,TIME_WAIT为什么是2倍的MSL?
当第四次挥手发送完一个ACK报文的时候,它到达服务端的最大报文段传输时间为MSL,在极端情况下,刚好一个MSL的时候ACK报文段丢失,那么服务端就会重传一个FIN,那么它发送到客户端的时间就又是一个MSL,那么这种情况是极端的情况,也就是最大会有2倍的MSL时间间隔,当丢失后重传的FIN到达客户端的时候,那客户端就会重新设置为2倍的MSL,并且重传ACK。
3,为什么建立连接是三次握手,关闭连接确是四次挥手呢?
建立连接的时候, 服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。
而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。
4,如果已经建立了连接,但是客户端突然出现故障了怎么办?
TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。