三大网络层传输的遗留问题:
transmission control protocol (TCP)
TCP建立一种逻辑连接,是传输层的协议,提供可靠的传输服务
特点:
- 完全可靠(无重复,不丢包) (每个报文都有编号不会乱序)
- 面向连接 (通信前先建立连接,建立后,data顺着连接源源不断地传输)
- 全双工流的传输服务 (双向+异步)
- 端到端的通信协议 (两个进程直接通信:end to end,point to point)
- 流接口(流:有序号,不会乱序)
- 可靠的连接启动与关闭 (三次握手四次挥手)(发完数据就会关闭连接不占用带宽)
底层硬件并不支持物理连接。传输层使用网络层IP地址来构建逻辑连接。
连接
- 物理连接:专门有一条线路实现两端的直接通信
- 逻辑连接:两端只是逻辑上可达(间接的物理连接)
TCP数据报
TCP借助IP来传输数据。
每一个TCP数据报都会被封装到一个IP数据报中,然后发送到Internet中。
IP不会读取/改变TCP数据报的内容。(整个TCP报文都作为IP数据报的payload)
实现可靠性
可靠性的最大的问题在于:
包丢失和重发
通过实现一个重传方案
接收端:
接收端收到IP报文,回送源端一个响应报文(ACK)作为确认
源端:
TCP程序重传丢失的IP报文
- 条件:超时没有收到响应报文 超时:2台通信主机之间的TCP协议来定时间(动态调整,根据某个算法)
传输过程中:每一条信息的传输都会有一个ack回复
重传时间的确定
自适应重传
TCP监视时延(发送时记下时间,收到响应时提取时间)
调整重传时间来适应变化的情况。
缓冲 流量控制与窗口
TCP使用窗口机制来控制数据流量。
当连接建立起来的时候,连接的每一端都会分配出一个buffer用于存放发来的数据,然后发送当前缓冲区的尺寸来告诉另一端尚可接受数据的大小。
window:当前时间下buffer可用的空间。
三次握手(TCP建立全双工的连接) 解决可靠性
tcp的运输链接
- 要使彼此得知对方的存在
- 要使双方协商一些参数(最大报文长度,最大窗口大小,服务质量等等)
- 能够对运输实体资源(缓存大小,连接表中的项目等等)进行分配
TCP连接的建立采用:Client(主动建立连接的应用进程)-Server方式(被动等待连接建立的应用进程)(CS模式)
三次握手
- client端发出SYN的TCP报文请求建立连接 (seq=x)
- server端发出ACK,SYN报文,确定收到建立起c->s的单工通信的同时,发出报文中的SYN=1也是向client端请求建立全双工的另一半连接 (seq = y ack = x+1)
- client端发出ack确认报文,TCP连接正式建立 (ack = y+1)
注意这三者的seq值。
然后即可进行数据传输,这一部分可以参考计算机网络实验TCP通信的代码:
Viende:TCP计网实验代码
四次挥手断开连接
数据传输结束后,通信双方都可以释放连接
- Client首先对Server发出连接释放报文FIN=1 seq=u。停止数据的发送(之后只会发送通信状态确认的报文,不会再发送有效数据信息)等待B的确认
- Server端发出确认报文,ack=u+1,seq= v。TCP服务器端告知高层应用进程,此时Client->Server这一半的通信就已经释放了。TCP连接处于半关闭状态。但server若要发送给client数据,client仍然要接受。
- Server端发出FIN=1 ack=1的结束连接报文请求。seq = w ack=u+1
- client端收到释放连接报文时,发出确认ack = w+1,经过一段时间(2ms,保证client发送的最后一个ack报文能够到达B,本连接持续时间内的所有报文段都从网路中消失),双方断开tcp连接,释放连接上的所有资源(buffer,port,带宽)
拥塞(congestion)控制技术
在现代互联网中,丢包更可能被网络拥塞导致,而不是硬件上的错误
TCP使用丢包率来衡量网络的拥塞程度。通过减少包丢失率来控制拥塞
三种控制拥塞的技术
TCP的报文格式(不能叫帧格式。那是数据链路层的术语)
源端口 (2B) 目的端口(2B)+seq (4B)+ack(4B)+headlen(4位)+后续(滑动窗口buffermax :2B 所以是65535个存储单元)
FIN:释放连接
ACK:确认报文 ack字段是否有效
SYN:连接报文