TCP的三次握手和四次挥手+TCP和UDP的区别
TCP的三次握手:
LISTEN:表示服务器端的某个socket处于监听状态,可以接收连接了。
SYN_SENT:当客户端SOCKET执行connect连接时,它首先发送syn报文,随即会进入到此状态,表示客户端已发送syn报文,等待服务器端回应报文。
SYN_RCVD:表示服务器端接收到了SYN报文。(此报文用nestat很难观察到,很短暂)
ESTABLISHED:表示连接已经建立。
服务端在第二次握手时分配资源,客户端在第三次握手时分配资源。
TCP规定SYN=1时不能携带数据,但要消耗一个序号
1.为什么不进行两次握手:
情况1:A发送的请求报文连接段没有丢失,而是在某个网络节点滞留较长时间,以致延误到请求释放后的某个时间到达B,本来是一个早已失效的报文段,但是B收到了此失效连接请求报文段后,就误以为A又重新发送的连接请求报文段,并发送确认报文段给A,同意建立连接,如果没有三次握手,那么B发送确认后,连接就建立了,而此时A没有发送建立连接的请求报文段,于是不理会B的确认,也不会给B发送数据,而B却一直等待A发送数据,因此B的许多资源就浪费了。
情况2:考虑计算机S和C之间的通信,假定C给S发送一个连接请求分组,S收到了这个分组,并发 送了确认应答分组。按照两次握手的协定,S认为连接已经成功地建立了,可以开始发送数据分组。可是,C在S的应答分组在传输中被丢失的情况下,将不知道S 是否已准备好,不知道S建立什么样的序列号,C甚至怀疑S是否收到自己的连接请求分组。在这种情况下,C认为连接还未建立成功,将忽略S发来的任何数据分 组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。
2.为什么不进行4次握手?
因为在三次结束之后,就已经可以保证A可以给B发信息,A可以收到B的信息; B可以给A发信息,B可以收到A的信息。如果四次,那么就造成了浪费
TCP的四次挥手:
FIN_WAIT_1/FIN_WAIT_2:都表示等待对方的FIN报文。FIN_WAIT_1(netstat难看到)是客户端想主动关闭连接,向服务器端发送FIN报文后,进入此状态;当服务器端回应ACK报文后,客户端进入到FIN_WAIT_2状态(netstat还可以看到)。
TIME_WAIT(实现典型值是30s,1m,2m;RFC中是2m):表示客户端收到了服务器端的FIN报文,并发送了ACK报文,等待2MSL后到达CLOSED状态。如果FIN_WAIT_1状态下,收到了对方同时带有FIN标志和ACK表只的报文时,可以直接进入到TIME_WAIT状态,无需经过FIN_WAIT_2状态。
CLOSING(少见):表示双方同时关闭连接,同时调用close函数。
CLOSE_WAIT:表示服务器端收到客户端的FIN报文后,回送ACK报文并考虑是否要发FIN报文的时间。
LAST_ACK:表示服务器端在发送完FIN报文后,最后等待客户端回送ACK报文的时间,一旦收到即进入CLOSED状态。
解析:当客户A 没有东西要发送时就要释放 A 这边的连接,A会发送一个报文(没有数据),其中 FIN 设置为1, 服务器B收到后会给应用程序一个信,这时A那边的连接已经关闭,即A不再发送信息(但仍可接收信息)。 A收到B的确认后进入等待状态,等待B请求释放连接, B数据发送完成后就向A请求连接释放,也是用FIN=1 表示, 并且用 ack = u+1(如图), A收到后回复一个确认信息,并进入 TIME_WAIT 状态, 等待 2MSL 时间。
1.为什么要等待2MSL呢?
1)保证A发送的最后一个ACK报文段能够到达B。2)防止“已失效的连接请求报文段”出现在本连接中。
- 1)这个ACK报文段有可能丢失,使得处于LAST-ACK状态的B收不到对已发送的FIN+ACK报文段的确认,B超时重传FIN+ACK报文段,而A能在2MSL时间内收到这个重传的FIN+ACK报文段,接着A重传一次确认,重新启动2MSL计时器,最后A和B都进入到CLOSED状态,若A在TIME-WAIT状态不等待一段时间,而是发送完ACK报文段后立即释放连接,则无法收到B重传的FIN+ACK报文段,所以不会再发送一次确认报文段,则B无法正常进入到CLOSED状态。
- 2)A在发送完最后一个ACK报文段后,再经过2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失,使下一个新的连接中不会出现这种旧的连接请求报文段。
2.为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?
这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的连接请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可能未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。
socket编程与三次握手和四次挥手:
TCP和UDP的区别:
TCP提供面向连接的、可靠的数据流传输,而UDP提供的是无连接的、尽最大努力交付的数据报传输。
TCP是点对点连接的,UDP一对一,一对多,多对多都可以
TCP面向字节流,无记录边界。UDP面向报文,有记录边界。
TCP注重数据安全性,UDP数据传输快,因为不需要连接等待,少了许多操作,但是其安全性却一般。
TCP协议保证数据按序发送,按序到达,提供超时重传来保证可靠性,但是UDP不保证按序到达,甚至不保证到达,只是努力交付,即便是按序发送的序列,也不保证按序送到。
TCP协议所需资源多,TCP首部需20个字节(不算可选项),UDP首部字段只需8个字节。
TCP有流量控制和拥塞控制,UDP没有,网络拥堵不会影响发送端的发送速率。
TCP消耗资源,速度慢,效率低。
TCP对应的协议:
(1) FTP:定义了文件传输协议,使用21端口。
(2) Telnet:一种用于远程登陆的端口,使用23端口,用户可以以自己的身份远程连接到计算机上,可提供基于DOS模式下的通信服务。
(3) SMTP:邮件传送协议,用于发送邮件。服务器开放的是25号端口。
(4) POP3:它是和SMTP对应,POP3用于接收邮件。POP3协议所用的是110端口。
(5)HTTP:是从Web服务器传输超文本到本地浏览器的传送协议。
UDP对应的协议:
(1) DNS:用于域名解析服务,将域名地址转换为IP地址。DNS用的是53号端口。
(2) SNMP:简单网络管理协议,使用161号端口,是用来管理网络设备的。由于网络设备很多,无连接的服务就体现出其优势。
(3) TFTP(Trival File Transfer Protocal),简单文件传输协议,该协议在熟知端口69上使用UDP服务。
qq使用的协议:
登陆采用TCP协议和HTTP协议,你和好友之间发送消息,主要采用UDP协议,内网传文件采用了P2P技术。总来的说:
1.登陆过程,客户端client 采用TCP协议向服务器server发送信息,HTTP协议下载信息。登陆之后,会有一个TCP连接来保持在线状态。
2.和好友发消息,客户端client采用UDP协议,但是需要通过服务器转发。腾讯为了确保传输消息的可靠,采用上层协议来保证可靠传输。如果消息发送失败,客户端会提示消息发送失败,并可重新发送。
3.如果是在内网里面的两个客户端传文件,QQ采用的是P2P技术,不需要服务器中转。
UDP实现TCP:
由于在传输层 udp 已经是不可靠的,那就要在应用层自己实现一些保证可靠传输的机制,简单来说,要使用 udp 来构建可靠的面向连接的数据传输,就要实现类似于 tcp 的超时重传(定时器),拥塞控制(滑动窗口),有序接收(添加包序号), 应答确认(ack 和 seq)。目前已经有了实现 udp 可靠运输的机制——udt:主要目的高速广域网海量数据传输,他是应用层协议。