TCP协议

TCP协议格式:

源/目的端口号 :表示数据从哪里来,到哪个进程去;

4位TCP报头长度:表示TCP头部有多少个32位bit;

6位标志位

        URG: 紧急指针是否有效 
        ACK: 确认号是否有效
        PSH: 提示接收端应用程序立刻从TCP缓冲区把数据读走 
        RST: 对方要求重新建立连接; 我们把携带RST标识的称为复位报文段 
        SYN: 请求建立连接; 我们把携带SYN标识的称为同步报文段 
        FIN: 通知对方, 本端要关闭了, 我们称携带FIN标识的为结束报文段

16位窗口大小:描述接收方的TCP数据报缓冲区大小的数据,最大提供65535个字节的缓冲;

16位校验和:端到端的校验和,由发送端计算,然后由接收端验证;

16位紧急指针:标识哪部分数据是紧急数据;

TCP的连接机制:

TCP要经过三次握手建立连接(请求连接方一定是客户端),四次挥手断开连接(任意一方都可断开)。

TCP三次握手:

 

第一次握手:建立连接时,客户端发送SYN包到服务器,并进入SYN_SENT状态,等待服务器确认。

第二次握手:服务器收到SYN包,确认客户的SYN,同时自己发送一个SYN+ACK包,此时服务器进入SYN_RECV状态。

第三次握手:服务器收到服务器的SYN+ACK包,向服务器发送确认报ACK,发送完毕后,客户端和服务端进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

为什么三次握手?

这个问题的本质是,信道是不可靠的,但是我们要建立可靠的连接发送可靠的数据,也就是数据传输是需要可靠的。在这个时候三次握手是一个理论上的最小值,并不是说是TCP协议要求的,而是为了满足在不可靠的信道上传输可靠的数据所要求的。

 

 

 

TCP四次挥手:

第一次挥手:主机A发送一个FIN,用来关闭主机A到主机B的数据传输。主机A进入FIN_WAIT_1状态。

第二次挥手:主机B收到这个FIN信号后,回复一个ACK,确认收到的序列号。主机B进入CLOSE_WAIT状态,主机A收到报文进入FIN_WAIT_2状态。

第三次挥手:主机B关闭与主机A的连接,发送一个FIN给主机A。主机B进入LAST_ACK的状态。

第四次挥手:主机A收到主机B发来的结束报文段, 进入TIME_WAIT, 并发出 LAST_ACK;。

 TIME_WAIT状态:

断开方在经过第四次挥手之后进入TIME_WAIT状态,等待两个MSL的时间才能关闭。

为什么是两个MSL?

MSL是TCP报文的最大生存时间,因此TIME_WAIT持续2MSL的话,能保证在两个传输方向上的尚未被接受或迟到的报文段都已经消失(否则服务器⽴立刻重启, 可能会 收到来⾃自上⼀一个进程的迟到的数据, 但是这种数据很可能是错误的);同时也在理论上保证最后一个报文可靠到达假设最后⼀一个ACK丢失, 那么服务器会再重发⼀一个 FIN. 这时虽然客户端的进程不在了, 但是TCP连接还在, 仍然可以重发LAST_ACK)。

 

为什么建立连接是三次握手,而关闭连接却是四次握手呢?

这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。

TCP的可靠性:

校验和:发现TCP首部和数据在发送端到接收端之间发生的任何改动。如果接收方检测到校验和有差错,TCP段会被直接丢弃。

序列号:TCP将每个字节的数据都进行了编号. 即为序列号,数据按序到达。如果有必要,失序之后需要重新排序。

确认应答:每一个ACK都带有对应的确认序列号, 意思是告诉发送者, 我已经收到了哪些数据;,下一次你从哪里开始发。

超时重传:在发送某一个数据以后就开启一个计时器,在一定时间内如果没有得到发送的数据报的ACK报文,那么就重新发送数据,直到发送成功为止。

流量控制:TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。

拥塞控制:防止过多的数据注入到网络中,可以使网络中的路由器或链路不致过载。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值