在《TCP/IP协议的认识》一文中,我们知道TCP服务是属于传输层的。TCP提供了一种面向连接,提供可靠的,字节流传输服务。
那么什么是面向连接,是不是还有面向无连接的传输服务?我们来简单了解一下
1. 传输方式的分类
通过网络发送数据,大致可以分为面向有连接与面向无连接两种类型。
1)面向有连接型
面向有连接中,在发送数据之前,需要在收发主机之间连接一条通信线路。
举例:比如人们平常打电话,输入对方电话拨出之后,只有对方拿起电话才能真正通话,通话结束挂掉电话就如同切断电源。
优点:这样可以避免发送无谓的数据。
2) 面向无连接型
面向无连接则不要求建立和断开连接。发送端可于任何时候自由发送数据。反之,接收端也永远不知道自己会在何时从哪里收到数据。因此,在面向无连接的情况下,接收端需要时常确认是否收到了数据。
举例:比如在邮局寄包裹,负责处理邮递业务的营业员,不需要确认收件人的详细地址是否存在,也不需要确认收件人是否能收到包裹,只要发件人有一个寄件地址就可以办理邮寄业务。
优点:这种方式可以省略某些既定的、繁杂的手续,使处理变得简单,易于制作一些低成本的产品,减轻处理负担。
2. TCP服务模型
这里,借用一下网络上别人的图,链接在下方贴出,来说明三次握手和四次挥手的状态转换,以及TCP是如何传输数据的,如下图:
我们来理解一下上图的含义:
1. 三次握手:
1) 客户端初始化状态为 closed ,向服务器发送 syn ,之后,状态更改为syn-send
2) 服务器端初始化状态为 listen ,收到 syn 后,向客户端发送syn+ack,之后,状态更改为syn-rcvd
3) 客户端收到服务端发来的数据包后,向服务器端发送ack,之后,客户端状态更改为established
2. 四次挥手:
1) 客户端向服务器发送 fin ,之后客户端状态更改为fin-wait-1
2) 服务器端收到数据包后,还可以向客户端继续发送数据data,发送之后,再发出ack,之后服务器端状态更改为close_wait
3) 客户端收到服务器端发送的数据包,将状态更改为fin-wait-2,不做回应。服务器端接着向客户端发送fin,之后,服务器端状态更改为last-ack
4) 客户端收到服务器端的数据包后,向服务器端发送ack,之后,客户端的状态更改为time_wait,然后状态初始化为closed。服务器端收到客户端发来的数据包后,将状态更为close,然后初始化将状态保持为listen。
3. 数据传输:使用滑动窗口实现
要解决的问题:吞吐量、丢包、粘包、错误、超时重传,序号
1)如果一次只发送一个包,等待对方ack,之后再发送一个包。。。这样带来吞吐量低的问题。
2)滑动窗口的容量是固定的,一次可以发送多个包。已发送未ack,未发送未ack.比如4,5,6,7其中5,6,7已经ack,它会等待4被ack后,将4,5,6,7一起返回
注意:
每次是由客户端先主动发送网络数据包,服务器属于被动回应,这样设计为了:
1. 避免建立无效连接,占用带宽
2. 客户端跟服务器:一般都是多对一,或者说客户端比服务器要多,从节省资源上考虑
参考链接:https://zhuanlan.zhihu.com/p/53374516
原文:https://www.cnblogs.com/hld123/p/14591072.html