TCP/IP协议中,传输层给应用层提供服务
TCP/IP协议栈中,传输层只包含两个协议:缓存
数据在网络上传输,经过网络层的IP地址找到目标主机,经过传输层的端口号定位目标主机上的服务(应用程序)。因此传输层为相互通讯的应用进程提供了逻辑通讯。网络
端口号:16位,本地惟一便可,只有本地意义。优化
主要特色:操作系统
UDP数据报结构3d
TCP协议的特色指针
流式传输cdn
应用层发送数据是把数据放到了操做系统的TCP发送缓存中。操做系统发送时,去TCP发送缓存中取数据组成TCP数据包。应用层一次发送了8个字节的数据,操做系统第一次从发送缓存取出5个字节发送是能够的。或者应用层分别发送了一个8字节和一个10字节的包,操做系统从缓存中取出18个字节一次发送也是彻底能够的。接收端解析后,把字节流按顺序放入TCP接收缓存,每次从缓存中取必定的字节(跟发送端应用程序一次发送多少个字节没有关系)数递交给应用层。blog
因为应用层一次发送数据的大小和传输层一次递交给接收端应用层的数据的大小不必定彻底同样,因此应用层须要处理TCP粘包问题。进程
套接字(Socket)资源
IP+端口能够表达TCP传输中的一个端点。IP+Port称为套接字。
如何实现可靠传输
(后面我会更新一篇专栏更加详细的阐述可靠性传输的实现)
自动重传协议(ARQ)
发送端发送一个数据以后等待接收端响应成功接收的确认后,再发送下一个数据包(中止等待协议)。
必定时间内没有收到确认,发送端重传这个数据包(超时重传),最大等待时间略大于往返时延(RTT)。因此重传是自动进行的。
若是接收端发送的确认丢失,或者确认迟到即确认没有在最大等待时间内到达发送端,这两种状况也都会致使发送端进行超时重传。这种状况下,接收端会丢弃重复的数据。因此TCP协议还支持去重的功能。
通俗来讲,ARQ协议就是,只要你没在必定时间内告诉我收到了,我就认为你没收到。
中止等待协议实现简单,可是信道利用率低。由于发送数据的时间要远小于等待的时间。
流水线传输
上面提到的ARQ传输协议的信道利用率很是低,已经被淘汰。目前TCP协议中采用流水线传输。即发送端发送一个数据包后,不等待接收端的ACK就当即发送下一个准备好的数据包。当一个包发送了时间x以后,还没收到收到这个包的ACK,就会重传这个包。x的取值略大于网络的往返时延TTL。假设在时间x内,能够发送n个数据包,那么发送端必需要缓存n个尚未收到ack的数据包。即发送端维护一个发送窗口。
发送窗口内是发送了尚未收到ACK的数据包,当发送窗口内有数据收到ACK以后,就能够被移出窗口,而且窗口左边沿向前推动。当窗口内的数据大于窗口的最大长度时,就不能继续发送数据了,须要等待ACK或者进行重传。
举个例子,上图中假如滑动窗口的大小是5,此时窗口已经被占满。有两种状况,若是收到了数据包1的ACK那么数据包1被溢出窗口,窗口向前推动继续发送第6个包。若是没收到ACK,会重传数据包1,其实窗口也会向前推动,次数数据包6的内容跟数据包1的内容相同,即数据包1的重传。
累计确认是对上述机制的进一步优化,即接收端若是收到了连续的数据包一、二、3,只须要在ACK里回复收到了3,发送端就能够隐式的知道一、二、3都发送成功了。
TCP报文段格式: