码迷,mamicode.com
首页 > 其他好文 > 详细

TCP协议

时间:2020-06-24 13:47:19      阅读:54      评论:0      收藏:0      [点我收藏+]

标签:32位   一起   ef6   strong   因此   情况下   指定   rcv   大小限制   

TCP(Transmission Control Protocol)传输控制协议,面向连接的传输协议,在传输层。

TCP协议特点

  • 面向连接:通信之前必须建立连接,通信后断开连接
  • 每一个TCP连接只能是点对点的(一对一)
  • 提供的可靠的交付服务:通过TCP连接传输的数据,无差错,不丢失,不重复
  • 提供全双工通信
  • 面向字节流:TCP中的传输数据是以流的形式传输
  • TCP的首部占20字节

TCP报文头

技术图片

源端口

源端口占用16bit位,表示发送方主机进程占用的端口号,通过端口可以表时主机上的某一个应用

目的端口

目的端口占用16bit位,表示的是目的主机的端口号,网络通信连接接收方需要用IP+端口,IP在网络层,端口就在传输层记录, 端口号的个数 2^16 =65536

序号

序号占用32位,对发送的数据进行编号,接收方返回的确认序号就是下一个发送包的编号

确认号

确认号32位,确认号接收端发送给发送端的确认编号,表示该编号之前的数据都成功接收,接收端接收到该消息之后就可以继续发送后续的报文

报头长度(数据偏移)

占用了4个bit位,以32位(4字节)即字长为单位,报头的长度是可变的,最大是60个字节(占用4个bit位,2^4=15, 15 *4(字节) =60字节)

保留位

保留位占6位,必须全为0

标志位

标志位占6bit,存在6个标志,每个占用一个bit,如果有效则置为1,依次URG、ACK、PSH、RST、SYN、FIN

 URG:该位为1表示TCP包的紧急指针有效,督促上层应用尽快的处理紧急处理

 ACK:确认号有效

 PSH:push操作,该标志位为1接收方应尽快将报文交给应用层

 RST:(rest)连接复位,在通信过程找那个存在主机奔溃或其他原因早成连接错误,用该标志位来拒绝连接

 SYN:是一个同步序号,通常是与ACK合用来建立连接,三次握手

 FIN:需要端口连接时用到该标志位

窗口大小

占用16bit位,TCP中用来进行流量控制,通过窗口可以告知发送方窗口的大小,通过动态的控制发送窗口大小来控制发送到网络中包的大小,网络通畅时发送大的数据包,网络发送拥塞时发送小的数据包

检验和

占用16bit,通过对首部和数据进行校验来判断当前包是否正确

紧急指针

只有当URG标志置为1时才有效,紧急指针是一个正的偏移,和序号字段中的是相加表示紧急指针的最后的序号,TCP的紧急方式发送一条数据给接收端

三次握手

技术图片

 

 

 过程:

  1. 第一次握手:客户端发送请求到服务端,并且进入到SYN-SENT状态,等待服务端确认。(SYN = 1,seq(序号) = x)
  2. 第二次握手:服务端接收到连接请求,如果同意连接,向客户端发回确认报文段,服务端进入到SYN_RCVD状态。(SYN = 1,ACK = 1,seq = y,ack(确认号) = x+1)--->当收到确认后,表示 ack = x+1前(即序号x)的数据全部都接收到了。
  3. 第三次握手:客户端接收到服务端的确认报文,再向服务端发出确认报文,客户端和服务端都进入到ESTAB-LEISHED状态,可以进行双向通讯。(ACK = 1,seq = x+1,ack = y+1)

注:

TCP可以是两次握手嘛?

       TCP的三次握手不能改成两次握手,是为了防止已经过期的连接重新连接上

       如果只有前两次握手的情况下:假如在网络拥塞的情况下,客户端向服务端发出了第一次握手请求,由于客户端么有接收到来自服务端的ack确定,在饱和机制的影响,便再次发出请求,但是在某种原因下比上次的请求先到达到服务端,然后服务端直接给客户端回复了ack请求,此时客户端是可以给服务端发送数据的,如果此时客户端给服务端发送一个很小的数据包,发送完很快就断开了连接,而此时第一次的连接请求到达到服务端(其实本次请求应该是无效的),而在基于两次握手的情况下服务器端无法判断该请求的有效性,从而再次建立连接,因为本次要发送的数据与前面已经发送的数据包一致,因此此次连接是无意义的,相当于白白建立了连接。(三次握手的情况下,由于是客户端发送的请求,它能够识别第二次握手是否是重复的请求,便不会给客户端回应ack进行第三次握手,连接就无法建立)。

四次挥手

技术图片

 

 

 过程:

  1. 第一次挥手  客户端向服务端发送断开连接报文段,客户端进入FIN-WAIT-1状态(FIN = 1,seq=u)
  2. 第二次挥手  服务端接收到客户端的请求报文后,确认客户端的消息,由服务端回复客户端一个ACK报文,服务端进入到CLOSE-WAIT状态(ACK=1,seq=v, ack=u+1),客户端接收到第二次挥手消息后进入到FIN-WAIT-2状态,这时客户端不能给服务端发送消息,但服务端可以继续给客户端发送消息(单通道通信)

  3. 第三次挥手  服务端向客户端发送断开报文段,服务端进入到LAST-ACK状态(FIN = 1,ACK = 1,seq = w,ack = u+1)
  4. 第四次挥手  客户端接收到服务端发送的请求报文后,向服务端发送一个确认消息,客户端进入到TIME-WAIT状态。在等待2MSL时间后才进入到CLOSED状态,服务端接收到客户端的消息后进入到CLOSED状态(ACK = 1,seq = u+1,ack = w+1)

注:

TCP可以是三次挥手嘛?

       不可以,如果是三次挥手(由于第二次和第三次都是由服务端发出,如果这两次挥手统一看成是第二次挥手的情况),可能会造成数据的丢失,(第三次挥手到达要早于数据传输的情况),第二次与第三次挥手间会进行数据的传输。如果么有第四次挥手,便会进行超时重传;但是是存在三次挥手的可能,那就是客户端和服务端同时发起挥手。

技术图片

 第四次挥手后需要等待2MSL的原因:    

        为了保证发送的最后一个ACK到达服务端;防止已经失效的连接请求报文段出现在本次连接中。

 

TCP发送数据

技术图片

 

 

TCP的包发送和接收存在两个缓冲区,一个是发送缓冲区,一个是接收缓冲区。

发送缓冲区:TCP传输层数据包有大小限制,如果包过大的话,拆分成多个TCP包,发送的数据包过小,等待多个应用层消息打包成一个TCP的数据包进行发送  TCP报文头至少是20个字节

接收缓冲区:数据是没有明确的边界,接收数据是没办法指定一个或者多个消息一起读,只能选择一次读取多大的数据流,而这个数据流中包含着某个消息包的一部分数据

TCP协议

标签:32位   一起   ef6   strong   因此   情况下   指定   rcv   大小限制   

原文地址:https://www.cnblogs.com/128-cdy/p/13179865.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!