TCP协议

TCP协议

TCP传输控制协议(Transmission Control Protocol)是一种面向连接的协议,是可靠的字节流协议,支持超时重传,流量控制和对数据进行排序等。TCP协议还是全双工的。

  1. 面向连接。TCP不同于UDP,在传输数据前,需要先建立连接。TCP建立连接的过程,又叫三次握手。具体过程见第二节。
  2. 可靠性。TCP在发送数据时,要求对方返回一个确认。如果没有收到确认,就自动重传数据,并等待更长的时间。在数次重传之后,TCP才放弃,返回错误。
  3. 流量控制。TCP通告对端自己能够从对端接收的数据的大小,这称为通告窗口,在任何时候,对方发送的数据都不会大于通告窗口可用空间量。通告窗口是动态变化的,当接收来自对方的数据时,窗口就变小,当应用程序从缓冲区取走数据时,通告窗口又变大。
  4. 对数据进行重新排序。TCP给发送的每个字节关联一个序列号。当数据到达时,接收端首先根据序列号进行排序,这样就能知道丢失的数据和重复的数据,从而丢掉重复的数据,要求对端重传丢失的数据。
  5. TCP连接时全双工的。这意味着在一个连接上可以同时在两个方向上既发送数据又接收数据。全双工相当于有两条通道,两条通道可以独自关闭,形成一个单工连接。

三次握手

TCP连接发生在套接字编程中客户端调用connect函数之时。具体过程如下:
  1. 服务器准备好接受外来的连接,阻塞在accept调用。通过socket,bind和listen被动打开套接字。
  2. 客户端创建套接字并通过conenct发起主动连接。
  3. 客户端TCP发送一个SYN分节,告诉服务器将在连接中发送数据的初始序列号。
  4. 服务器对客户端发送的SYN进行确认(ACK)。同时也发送自己的SYN分节告诉客户端将在同一连接中发送数据的初始序列号。
  5. 客户端对服务器的SYN分节进行确认。
TCP三次握手示意图:


为什么是三次握手,而不是两次或者四次,五次?
如果只是两次握手,那么这是不可靠的。首先客户端发送SYN,服务器进行确认,然后服务器发送SYN。这样就结束了,那么,服务器就没有办法知道客户端有没有收到确认和请假。打个比方,淘宝。你和卖家沟通好后,你通知卖家发货到哪儿(第一次握手)。卖家将货发出(第二次握手)。如果你不进行确认收货(第三次握手)。那么显然这笔交易是不能成功的。
如果进行四次,五次,甚至更多,显然就多此一举了,而且还会有代价。同样是淘宝的例子。在你确认收货之后(第三次握手)。你可能担心卖家没有收到你的确认。你要求卖家发送收到你确认收货的确认(第四次握手)。同样,卖家在收到你的确认之后,安装你的要求发送确认的确认给你(第5次握手)。但是,它同样担心自己的确认没有到达,要你在发送确认。。。。这样一直循环下去。很显然是没有意义,画蛇添足的。同时,也可以看出,TCP协议并不是100%可靠的协议。

四次挥手

由于TCP是全双工的,两个方向上都要进行关闭,因此TCP连接的终止需要四次节。

  1. 客户端调用close。客户端TCP发送一个FIN分节,表示数据发送完毕,并关闭单方向通道。
  2. 服务器接收到这个FIN分节后,关闭这个方向上的通道。并发送确认给客户端。
  3. 服务器发送FIN分节,表示数据发送完毕。同时关闭通道。
  4. 客户端发送ACK进行确认。同时关闭通道。
两个方向上的通道均关闭。socket断开完成。

四次挥手示意图。


服务器和客户端均可执行主动关闭,但通常是客户端发起断开连接。


TIME_WAIT状态的持续时间使最长分节生命期(maxinum segment lifetime, MSL)的两倍。MSL是IP数据报能够在网络中存活的最长时间。

TIME_WAIT状态存在的两个理由。
  1. 可靠地实现TCP连接的终止。
  2. 允许老的重复分节在网络中消逝。防止新的TCP连接建立时,老的重复的分组对其造成干扰。

总结

TCP是可靠地面向连接的全双工协议。它的建立需要三次握手,而断开过程需要四次挥手。
以上内容参考TCP/IP 卷一 和UNIX 网络编程 卷一,加上自己的一些理解。有不足的地方,欢迎大家指出,共同学习进步。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值