图解
![](https://img.haomeiwen.com/i5815865/d8bd2df08894492f.jpeg)
![](https://img.haomeiwen.com/i5815865/c8ffefa1f3173141.png)
一、TCP建立连接三次握手
(1)、三次握手的过程
第一次握手:
- 1)主机A向主机B发送TCP连接请求数据包,其中包含主机A的初始序列号seq(A)=x。(其中报文中同步标志位SYN=1,ACK=0,表示这是一个TCP连接请求数据报文;序号seq=x,表明传输数据时的第一个数据字节的序号是x);
- 第一次握手:建立连接。客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x;然后,客户端进入SYN_SEND状态,等待服务器的确认;
第二次握手:
- 2)主机B收到请求后,会发回连接确认数据包。(其中确认报文段中,标识位SYN=1,ACK=1,表示这是一个TCP连接响应数据报文,并含主机B的初始序列号seq(B)=y,以及主机B对主机A初始序列号的确认号ack(B)=seq(A)+1=x+1)
- 第二次握手:
- 服务器收到SYN报文段。服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1);
- 同时,自己自己还要发送SYN请求信息,将SYN位置为1,Sequence Number为y;
- 服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RCVD状态;
第三次握手:
- 3)第三次,主机A收到主机B的确认报文后,还需作出确认,即发送一个序列号seq(A)=x+1;确认号为ack(A)=y+1的报文;
- 第三次握手:客户端收到服务器的SYN+ACK报文段。然后将ACK设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED(建立)状态,完成TCP三次握手。
![](https://img.haomeiwen.com/i5815865/782520c4109f4a2c.png)
(2)为什么需要第三次握手?
- 还要再发送一次确认是为了,防止已失效的连接请求报文段突然又传到了B,因而产生错误。
- 已失效的报文段:正常情况下:A发出连接请求,但因为丢失了,故而不能收到B的确认。于是A重新发出请求,然后收到确认,建立连接,数据传输完毕后,释放连接,A发了2个,一个丢掉,一个到达,没有“已失效的报文段”。
- 但是,某种情况下,A的第一个在某个节点滞留了,延误到达,本来这是一个早已失效的报文段,但是在A发送第二个,并且得到B的回应,建立了连接以后,这个报文段竟然到达了,于是B就认为,A又发送了一个新的请求,于是发送确认报文段,同意建立连接,假若没有三次的握手,那么这个连接就建立起来了(有一个请求和一个回应),此时,A收到B的确认,但A知道自己并没有发送建立连接的请求,因为不会理睬B的这个确认,于是呢,A也不会发送任何数据,而B呢却以为新的连接建立了起来,一直等待A发送数据给自己,此时B的资源就被白白浪费了。但是采用三次握手的话,A就不发送确认,那么B由于收不到确认,也就知道并没有要求建立连接。
简而言之:第三次握手,主机A发送一次确认是为了防止:如果客户端迟迟没有收到服务器返回的确认报文,这时他会放弃连接,重新启动一条连接请求;但问题是:服务器不知客户端没收到,所以他会收到两个连接请求,白白浪费了一条连接开销。
二、TCP释放连接四次握手
(1)四次握手过程
假设主机A为客户端,主机B为服务器,其释放TCP连接的过程如下:
- 第一次分手:客户端设置Seq和ACK,向服务器端发送一个FIN报文段;此时,客户端进入FIN_WAIT_1状态;客户端表示没有数据要发送给服务器端了;
第二次分手:服务器端收到了客户端发送的FIN报文段,向主机1回一个ACK报文段,ACK为Sequence Number加1;客户端进入FIN_WAIT_2状态;服务器告诉客户端,我“同意”你的关闭请求; - 第三次分手:服务器向客户端发送FIN报文段,请求关闭连接,同时服务器进入LAST_ACK状态;服务器告诉客户端,我也没啥数据要发给你了,请求断开。
- 第四次分手:客户端收到服务器发送的FIN报文段,向服务器发送ACK报文段,然后客户端进入TIME_WAIT状态;服务器收到客户端的ACK报文段以后,就关闭连接;此时,客户端等待2MSL后依然没有收到回复,则证明服务端已正常关闭,那好,客户端也可以关闭连接了。
![](https://img.haomeiwen.com/i5815865/3cfd87d2a5a0fdc1.png)
首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
主机A发送FIN后,进入终止等待状态, 服务器B收到主机A连接释放报文段后,就立即给主机A发送确认,然后服务器B就进入close-wait状态,此时TCP服务器进程就通知高层应用进程,因而从A到B的连接就释放了。此时是“半关闭”状态。即A不可以发送给B,但是B可以发送给A。
此时,若B没有数据报要发送给A了,其应用进程就通知TCP释放连接,然后发送给A连接释放报文段,并等待确认。A发送确认后,进入time-wait,注意,此时TCP连接还没有释放掉,然后经过时间等待计时器设置的2MSL后,A才进入到close状态。
(2)为什么要等待2MSL呢?
- MSL即Maximum Segment Lifetime,也就是最大报文生存时间,他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。引用《TCP/IP详解》中的话:“它(MSL)是任何报文段被丢弃前在网络内的最长时间”。
- RFC 793中规定MSL为2分钟,实际应用中常用的是30秒,1分钟和2分钟等。
- TCP的TIME_WAIT状态需要等待2MSL,当TCP的一端发起主动关闭,在发出最后一个ACK包后,即第3次握手完成后发送了第四次握手的ACK包后就进入了TIME_WAIT状态,必须在此状态上停留两倍的MSL时间,等待2MSL时间主要目的是怕最后一个ACK包对方没收到,那么对方在超时后将重发第三次握手的FIN包,主动关闭端接到重发的FIN包后可以再发一个ACK应答包。
- 在TIME_WAIT状态时两端的端口不能使用,要等到2MSL时间结束才可继续使用。当连接处于2MSL等待阶段时任何迟到的报文段都将被丢弃。
- 不过在实际应用中可以通过设置SO_REUSEADDR选项达到不必等待2MSL时间结束再使用此端口。
(3)为什么TCP释放连接需要四次?
- TCP建立连接要进行三次握手,而断开连接要进行四次。这是由于TCP的半关闭造成的。因为TCP连接是全双工的(即数据可在两个方向上同时传递)所以进行关闭时每个方向上都要单独进行关闭。这个单方向的关闭就叫半关闭。当一方完成它的数据发送任务,就发送一个FIN来向另一方通告将要终止这个方向的连接。
注意:
1)发送了FIN只是表示这端不能继续发送数据(应用层不能再调用send发送),但是还可以接收数据。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据,比如:如主机A收到主机B的FIN断开TCP连接请求,只是表示主机B已经发送完数据,主机A收到FIN后作出应答,并终止这个方向的数据传输,此时处于半关闭状态。但是主机A仍然可以发送数据的,只有当主机A发送完数据并发送FIN给主机B时,主机B才停止这个方向的数据传输,并关闭TCP连接。
2)在很多时候,TCP连接的断开都会由TCP层自动进行,例如你CTRL+C终止你的程序,TCP连接依然会正常关闭,你可以写代码试试。
IP协议
- IP是在TCP/IP协议族中网络层的主要协议,任务仅仅是根据源主机和目的主机的地址来传送数据。
- 为此目的,IP定义了寻址方法和数据报的封装结构。
- 第一个架构的主要版本,现在称为IPv4,仍然是最主要的互联网协议,尽管世界各地正在积极部署IPv6。
- IP协议的作用在于把各种数据包准确无误的传递给对方,其中两个重要的条件是IP地址和MAC地址(Media Access Control Address)。
- 由于IP地址是稀有资源,不可能每个人都拥有一个IP地址,所以我们通常的IP地址是路由器给我们生成的IP地址,路由器里面会记录我们的MAC地址。
- 而MAC地址是全球唯一的,除去人为因素外不可能重复。
举一个现实生活中的例子,IP地址就如同是我们居住小区的地址,而MAC地址就是我们住的那栋楼那个房间那个人。
协议
TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网间协议)定义了主机如何接入Internet 及数据如何传输的标准。
TCP/IP 是 TCP 和 IP 协议的合称,但实际上 TCP/IP 协议是指 Internet 整个 TCP/IP 协议簇,不同于 ISO 七层模型的分层,TCP/IP 协议参考模型把所有 TCP/IP 系列协议归纳抽象为4层:
应用层 协议:TFTP、HTTP、SNMP、FTP、SMTP、DNS、Telnet...
传输层 协议:TCP、UDP
网路层 协议:IP、ICMP、OSPF、EIGRP、IGMP
数据链路层 协议:SLIP、CSLIP、PPP、MTU
TCP/IP是一种工业标准的协议集,为广域网 WAN 而设计。每一个抽象层建立在低一层所提供的服务上,并为高一层提供服务。
在 TCP/IP 协议中两个 Internet 主机通过路由器和对应的层连接,各主机上得应用通过数据通道相互执行读取操作。
网友评论