端⼝号(Port)标识了⼀个主机上进⾏通信的不同的应⽤程序;
在TCP/IP协议中,⽤ "源IP","源端⼝号","⽬的IP","⽬的端⼝号","协议号"
这样⼀个五元组来标识⼀个通信(可以通过netstat-n查看);
如图,这个udp报文中给出了16位的UDP长度,而且除了数据以外的内容长度是固定的,都是8字节,那么用 UDP长度减去8字节就是数据的部分
了,实现数据的分离!!!!!
通过目的端的端口号来进行分用—分配给客户端对应的端口处!!!!!
拥有发送缓冲区和接收缓冲区两个缓冲区
!!!!和UDP一致,有16位目的端口号
TCP是具有可靠性的·,UDP则没有
提问:为什么需要两个信号嘞?
服务器不只是做应答,还要求对方能接受到自己的数据
丢弃
如何解决这个问题呢?????????????????????
答案是,如果发送端在发送内容前就知道接收端的接收缓冲区的剩余空间大小
不就好啦!!!!!!!!!!
这就需要使用 TCP报头的16位窗口大小
啦!!!!
为什么需要这个字段?
以三次握手为例子,想要两端进行通信,必须要先完成三次握手!!!!
其实,序号就是要传递的数据的最后一个字节编号,如图,第一个数据的序号就是1000,确认序号就是1001
每⼀个ACK都带有对应的确认序列号,意思是告诉发送者,我已经收到了哪些数据;下⼀次你从哪⾥开始发.
在正常情况下,TCP要经过三次握⼿建⽴连接,四次挥⼿断开连接
为什么要使用三次握手?????
–为了以最快的方式验证全双工!!!!!!!!
------即客户端和服务端都能写能发!!!!!!
刚才我们讨论了确认应答策略,对每⼀个发送的数据段,都要给⼀个ACK确认应答.收到ACK后再发送下⼀个数据段.这样做有⼀个⽐较⼤的缺点,就是性能较差.尤其是数据往返的时间较⻓的时候.
既然这样⼀发⼀收的⽅式性能较低,那么我们⼀次发送多条数据,就可以⼤ 的提⾼性能(其实是将多个段的等待时间重叠在⼀起了).
那么,怎么知道我一次性可以发多少个数据呢????--------使用滑动窗口!!!
情况⼀:数据包已经抵达,ACK被丢了
滑动窗口正常工作
,因为实际数据已经收到,只是没有应答,只要后序其他有应答完成即可。情况⼆:数据包就直接丢了.
滑动窗口左端不动,右端移动
-------这种机制被称为"⾼速重发控制"(也叫"快重传").接收端处理数据的速度是有限的.如果发送端发的太快,导致接收端的缓冲区被打满,这个时候如果发送端继续发送,就会造成丢包,继⽽引起丢包重传等等⼀系列连锁反应.
因此TCP⽀持根据接收端的处理能⼒,来 决定发送端的发送速度.这个机制就叫做流量控制(Flow Control);
虽然TCP有了滑动窗⼝这个⼤杀器,能够⾼效可靠的发送⼤量的数据.但是如果在刚开始阶段就发送⼤量的数据,仍然可能引发问题.
因为⽹络上有很多的计算机, 可能当前的⽹络状态就已经⽐较拥堵. 在不清楚当前⽹络状态下,贸然发送⼤量的数据,是很有可能引起雪上加霜的.
TCP引⼊ 慢启动机制
,先发少量的数据,探探路,摸清当前的⽹络拥堵状态,再决定按照多⼤的速度传输数据;
滑动窗口=min(对方win,阻塞窗口)
!!!!!!TCP协议通过以下机制保证数据传输的可靠性:
min(cwnd, rwnd)
(拥塞窗口与接收窗口的最小值)。通过动态调整拥塞窗口(cwnd)避免网络过载:
TCP通过以上机制在不可靠的IP层上实现了可靠的、面向连接的数据传输。