标签:32位 一起 ef6 strong 因此 情况下 指定 rcv 大小限制
TCP(Transmission Control Protocol)传输控制协议,面向连接的传输协议,在传输层。
源端口
源端口占用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的紧急方式发送一条数据给接收端
过程:
注:
TCP可以是两次握手嘛?
TCP的三次握手不能改成两次握手,是为了防止已经过期的连接重新连接上。
如果只有前两次握手的情况下:假如在网络拥塞的情况下,客户端向服务端发出了第一次握手请求,由于客户端么有接收到来自服务端的ack确定,在饱和机制的影响,便再次发出请求,但是在某种原因下比上次的请求先到达到服务端,然后服务端直接给客户端回复了ack请求,此时客户端是可以给服务端发送数据的,如果此时客户端给服务端发送一个很小的数据包,发送完很快就断开了连接,而此时第一次的连接请求到达到服务端(其实本次请求应该是无效的),而在基于两次握手的情况下服务器端无法判断该请求的有效性,从而再次建立连接,因为本次要发送的数据与前面已经发送的数据包一致,因此此次连接是无意义的,相当于白白建立了连接。(三次握手的情况下,由于是客户端发送的请求,它能够识别第二次握手是否是重复的请求,便不会给客户端回应ack进行第三次握手,连接就无法建立)。
过程:
第二次挥手 服务端接收到客户端的请求报文后,确认客户端的消息,由服务端回复客户端一个ACK报文,服务端进入到CLOSE-WAIT状态(ACK=1,seq=v, ack=u+1),客户端接收到第二次挥手消息后进入到FIN-WAIT-2状态,这时客户端不能给服务端发送消息,但服务端可以继续给客户端发送消息(单通道通信)
注:
TCP可以是三次挥手嘛?
不可以,如果是三次挥手(由于第二次和第三次都是由服务端发出,如果这两次挥手统一看成是第二次挥手的情况),可能会造成数据的丢失,(第三次挥手到达要早于数据传输的情况),第二次与第三次挥手间会进行数据的传输。如果么有第四次挥手,便会进行超时重传;但是是存在三次挥手的可能,那就是客户端和服务端同时发起挥手。
第四次挥手后需要等待2MSL的原因:
为了保证发送的最后一个ACK到达服务端;防止已经失效的连接请求报文段出现在本次连接中。
TCP的包发送和接收存在两个缓冲区,一个是发送缓冲区,一个是接收缓冲区。
发送缓冲区:TCP传输层数据包有大小限制,如果包过大的话,拆分成多个TCP包,发送的数据包过小,等待多个应用层消息打包成一个TCP的数据包进行发送 TCP报文头至少是20个字节
接收缓冲区:数据是没有明确的边界,接收数据是没办法指定一个或者多个消息一起读,只能选择一次读取多大的数据流,而这个数据流中包含着某个消息包的一部分数据
标签:32位 一起 ef6 strong 因此 情况下 指定 rcv 大小限制
原文地址:https://www.cnblogs.com/128-cdy/p/13179865.html