Open dduo518 opened 3 years ago
TCP提供可靠数据传输,通过流量控制、序号、确认、定时器保证tcp争取地、有序地将数据从发送经常交付给接收进程 TCP还提供了拥塞控制,防止任何一条tcp连接用过多流量淹没通信主机之间的链路和交换设备,力求为每个通过一条拥塞网络链路 的连接平等的共享网络链路带宽 多路分解: 将运输层报文段中的数据交付到正确的套接字的工作,报文段数据(运输层)--->套接字(进程) 多路复用: 在源主机从不同套接字中收集数据块,并为每个数据封装上首部信息,从而生成报文段,然后将报文段传递到网络层,套接字(进程)---> 报文段(运输层)
TCP连接建立过程中要解决三个问题
SYN=1
seq=x
SYN-SENT
ACK=1
ack=x+1
seq=y
SYN-REVD
ack=y+1
seq=x+1
ESTABLISHED
三次握手保证了一次正常的连接,服务端只有在收到客户端最后的确认连接报文之后才会给连接分配文件句柄及内存空间,这样避免了无效连接大量的占用资源,造成资源负载过高。中间任何一次报文传输异常,服务端都不会为连接分配文件句柄及内存。
FIN-WAIT-1
close-wait
half-close
FIN-WAIT-2
last-ack
time-wait
时间等待计时器
在客户端进入time-wait状态后会有一个时间等待计时器,tcp还有个保活计时器,当客户端主动与服务端建立TCP连接,但是后面客户端的主机突然故障,服务器以后都不能接收到客户端发送的数据,因此需要有个措施确保服务器不要再白白的等待下去,这就是使用保活计时器。 服务器每收到一次客户的数据,就重新设置保活计时器,时间的设置通常是2小时,若俩小时内没有收到客户端的数据,服务端就发送一次探测报文段,有以后每隔75s发送一次,如果一连10次发送都没有响应,服务端就认为客户端处了故障,接着关闭TCP。
rwnd
拥塞控制的实现 发生方维持一个拥塞窗口的状态变量,拥塞控制的窗口大小取决于网络的拥塞程度,并且动态的变化。
不断增大拥塞窗口值
整个过程就是当开始传输时,慢开始算法将拥塞窗口值按照指数增长,当到达一个网络拥塞限制值时,特换为避免拥塞算法,减缓窗口值得增长,呈现一个线性增长的过程
每个socket被创建后,都会分配俩个缓冲区,输入缓冲区和输出缓冲区 write\send并不直接向网络中传输数据,而是先将数据写入缓冲区中, 在由TCP协议将数据从缓冲区发送到目标机器,一旦将数据写入到缓冲区,函数就可以成功返回,不管他们有没有到达目标机器,也不管他们何时被发送到网络,这些都是TCP协议负责的事情 read\recv 函数也是如此,也从输入缓冲区中读取数据,而不是直接从网络中读取
阻塞模式 首先会检查缓冲区,如果缓冲区中有数据,那么就读取,否则函数会被阻塞,直到网络上有数据到来 如果要读取的长度小于缓冲区中的数据长度,那么就不能一次性将缓冲区重点额所有数据读出,剩余数据将不断挤压,知道读取到数据后read\recv函数才会返回,否则一直被阻塞
非阻塞模式 非阻塞模式下读取,如果缓冲区还没有数据,则会返回特定的错误,那么继续循环读取
TCP位于运输层
运输层的多路复用与多路分解
TCP提供可靠数据传输,通过流量控制、序号、确认、定时器保证tcp争取地、有序地将数据从发送经常交付给接收进程 TCP还提供了拥塞控制,防止任何一条tcp连接用过多流量淹没通信主机之间的链路和交换设备,力求为每个通过一条拥塞网络链路 的连接平等的共享网络链路带宽 多路分解: 将运输层报文段中的数据交付到正确的套接字的工作,报文段数据(运输层)--->套接字(进程) 多路复用: 在源主机从不同套接字中收集数据块,并为每个数据封装上首部信息,从而生成报文段,然后将报文段传递到网络层,套接字(进程)---> 报文段(运输层)
TCP三次握手四次挥手
三次握手建立连接
TCP连接建立过程中要解决三个问题
SYN=1
,顺序位seq=x
,此时TCP客户端进入SYN-SENT
状态SYN=1
,ACK位置位1ACK=1
,确认号ack=x+1
,顺序号seq=y
,此时服务端进入SYN-REVD
状态。ACK=1
,确认好ack=y+1
,顺序号为seq=x+1
,此时客户端进入ESTABLISHED
状态。 服务端收到确认后也进入ESTABLISHED
状态三次握手的保证
三次握手保证了一次正常的连接,服务端只有在收到客户端最后的确认连接报文之后才会给连接分配文件句柄及内存空间,这样避免了无效连接大量的占用资源,造成资源负载过高。中间任何一次报文传输异常,服务端都不会为连接分配文件句柄及内存。
四次挥手释放连接
FIN-WAIT-1
终止等待1状态,等待服务端的确认close-wait
关闭等待状态,TCP服务器进程这时会通知高层应用进程,此时客户端--->服务端方向的连接释放,也就是TCP处于半关闭half-close
状态,即客户端已经没有数据发送,但是服务端如果还有没有发送完的数据,仍然可以继续发送,客户端仍然可以接收,服务端---> 客户端方向的连接未关闭。 此时服务端会做一些最后的数据发送,将未发送完成的数据继续发送 客户端收到第二次的报文确认后进入FIN-WAIT-2
终止等待2 状态,等待服务端发送的释放报文段last-ack
最后确认状态,等待客户端的确认。time-wait
状态,此时TCP连接还没有释放,必须经过时间等待计时器
设置的2MSL时间之后才会完全的释放。 等待2MSL的时间是为了保证最后一个连接释放报文ACK能正常的发送到服务端,最后一次ack有可能会丢失,当发生丢失的时候,服务端处于last-ack
状态,收不到客户端的ack报文,服务端会超市重传第三次的连接释放报文,然后客户端会在2MSL内收到重传的释放报文,再次进行第二次ack,重新启动2MSL计时器。最后才进入close状态保活计时器
在客户端进入
time-wait
状态后会有一个时间等待计时器,tcp还有个保活计时器,当客户端主动与服务端建立TCP连接,但是后面客户端的主机突然故障,服务器以后都不能接收到客户端发送的数据,因此需要有个措施确保服务器不要再白白的等待下去,这就是使用保活计时器。 服务器每收到一次客户的数据,就重新设置保活计时器,时间的设置通常是2小时,若俩小时内没有收到客户端的数据,服务端就发送一次探测报文段,有以后每隔75s发送一次,如果一连10次发送都没有响应,服务端就认为客户端处了故障,接着关闭TCP。TCP流量控制与拥塞控制
流量控制
rwnd
,发送方的发送窗口不能超过过接收方给出得接收窗口值拥塞控制
拥塞控制的实现 发生方维持一个拥塞窗口的状态变量,拥塞控制的窗口大小取决于网络的拥塞程度,并且动态的变化。
不断增大拥塞窗口值
,直到到达一个拥塞出现的值,当网络发生拥塞时,路由器就要丢弃分组,因此只要发送方没有按时收到应当到达的确认报文,就可以设想出现了拥塞整个过程就是当开始传输时,慢开始算法将拥塞窗口值按照指数增长,当到达一个网络拥塞限制值时,特换为避免拥塞算法,减缓窗口值得增长,呈现一个线性增长的过程
TCP 输入\输出缓冲区
缓冲区
每个socket被创建后,都会分配俩个缓冲区,输入缓冲区和输出缓冲区 write\send并不直接向网络中传输数据,而是先将数据写入缓冲区中, 在由TCP协议将数据从缓冲区发送到目标机器,一旦将数据写入到缓冲区,函数就可以成功返回,不管他们有没有到达目标机器,也不管他们何时被发送到网络,这些都是TCP协议负责的事情 read\recv 函数也是如此,也从输入缓冲区中读取数据,而不是直接从网络中读取
使用write\send发送数据
使用read\recv读取数据
阻塞模式 首先会检查缓冲区,如果缓冲区中有数据,那么就读取,否则函数会被阻塞,直到网络上有数据到来 如果要读取的长度小于缓冲区中的数据长度,那么就不能一次性将缓冲区重点额所有数据读出,剩余数据将不断挤压,知道读取到数据后read\recv函数才会返回,否则一直被阻塞
非阻塞模式 非阻塞模式下读取,如果缓冲区还没有数据,则会返回特定的错误,那么继续循环读取