TCP

来源:互联网 发布:java 异常处理 编辑:程序博客网 时间:2024/06/02 03:45
 Welcome to TCP

TCP协议是网络中的比较重要的一个协议,http协议是建立在tcp基础之上的,所以想要学习网络编程,尤其是其中的
http网络传输等方面需要我们掌握好tcp协议,而tcp中比较重要的是三次握手建立连接以及四次挥手断开连接。

OSI七层模型                         五层因特网协议                 TCP/IP四层协议 
  应用层                                        应用层               应用层(Telnet,FTP,email) 
  表示层 
  会话层 
  传输层                                        传输层                  传输层(TCP,UDP) 
  网络层                                        网络层                    网络层(IP,ICMP,IGMP) 
  数据链路层                              数据链路层               数据链路层(设备驱动) 
  物理层                                         物理层   

TCP:传输控制协议,是一种面向连接的,可靠的,基于字节流的传输层控制协议,完成传输层工作。 
TCP连接包括三个状态:连接创建,数据传送,连接终止。 

位码即tcp标志位,有6种标示:SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急) 

Sequence number(顺序号码) Acknowledge number(确认号码) 


 TCP三次握手建立连接
 

####注意:图中第三次握手时发的seq number有讲是随机数Z,有人讲是X+1,后面实际确认后再改。<br>


第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机;


第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=7654321的包


第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,
若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。


###TCP四次挥手断开连接



由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成
它的数据发送任务后就发送一个FIN终止这个方向的发送通道。收到一个FIN意味着
这个方向没有数据流动,一个TCP连接收到一个FIN后仍能发送数据。首先进行关闭
一方将执行主动关闭,另一方被动关闭。<br>
(1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。
(2)服务器B收到这个FIN,发回一个ACK,确认序号为收到的序号+1。
(3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A。
(4)客户端A发回ACK报文确认,并将确认序号设置为收到序号+1。


==============================================================<br>


为什么需要三次握手:<br>
client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间滞留,
以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的连接
请求报文段,但server收到失效的连接请求报文段误以为是client再次发出的一个
新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”
那么只要server发出确认,新的请求就建立了。由于现在client并没有重新建立连接
的请求,因此并不会理睬server的确认,也不会向server发送数据。但server却以为
新的运输连接已经建立,一直等待client发送数据。这样,server的很多资源就浪费。
采用“三次握手”可以避免这个问题。例如刚才,client不会向server的确认发送确认
server由于收不到确认,就知道client并没有建立连接。


为什么需要四次挥手:<br>
在tcp连接握手时为何ACK和SYN一起发送,这里ACK并没有和FIN一起发送呢。原因是
因为tcp是全双工模式,接受到FIN时意味将没有接受的数据,但是还是继续发送数据。




0 0
原创粉丝点击