整个TCP过程描述:
1)服务器默认的状态是LISTEN,客户端先向服务器发送一个SYS,表明自己要求链接,这时候客户端处于SYS_SENT状态;
2)服务器收到SYS,返回一个ACK,同时再补上一个SYS,这时候服务器端处于SYS_RECEIVE状态;
3)客户端收到了服务器返回的SYS,自己进化成ESTABLISHED状态,然后应答那个ACK,服务器接收到这个应答ACK,进化成ESTABLISHED状态。这样两个就算彻底连接了。
以上简称“三次握手”。
然后客户机与服务器可以传送数据,keepalive。
4)客户端向服务器发送一个FIN告诉服务器可以断开连接了,此时客户端处于FIN_WAIT 1状态。
5)服务器收到这个信息得知可以断开连接了,服务器处于CLOSE_WAIT状态,然后发送信息告诉客户端,服务器这时候处于LAST_ACK状态。
6)客户端收到服务器确认断开连接的信息,进化成FIN_WAIT 2状态,最后成为TIME_WAIT状态。等待一些时间已确保能收到服务器的应答。
以上过程简称“四次挥手”。
TCP的传输过程一共是十一个状态:LISTEN,SYS_SENT,SYS_RECEIVE,ESTABLISHED,FIN_WAIT 1,FIN_WAIT 2,CLOSE_WAIT,CLOSEING,LAST_ACK,TIME_WAIT,CLOSED.
CLOSEING:等待远端TCP 的连接终止请求确认
CLOSED:不在连接状态(其实是不存在的)
那么为什么TCP非要采取三次握手呢?
主要原因就是防止“由于网络阻塞,失效的信息又复活”的情况,举个例子:
A要给B传数据,开始的时候A传了一次请求,但是这个请求失效了,于是过了一段时间之后,A又穿了一次请求,这个时候B收到了,两个开始快乐的交流。交流完毕,双方断开。但是这个时候那个失效的信息终于爬到了B端,B也会如期打开端口跟A建立连接,A一看B来张开怀抱,那么A也要张开怀抱,但是A原打算要的数据已经都得到了,这一次虽然建立了链接,但是没东西可以要了。那么这样的链接就是空连接,白白浪费带宽。
TCP VS UDP
先说相同点,他俩都可以全双工,而且都是端到端的传输层通信协议。
TCP一般用来进行文件传输,因为文件的传输要求真真切切,一丝一毫都不能少,所以每一次建立必须要求数据都是十全十美。
TCP只能一对一,不支持广播和多播,TCP是面向字节流的。传输速度慢。
UDP一般用来网络语音传输,建立为主,通信质量其次。
UDP虽然不可靠但是也会尽全力交付,他是面向报文的,应用层给UDP什么样的报文,UDP就传送什么样的报文。
UDP支持一对一,一对多,多对多(各种视频会议),传输速度快。