**关于网络体系——udp与tcp**
在其前面说到了寻址与转发的问题,两个主机之间通信,实质上是两个进程之间进行通信,那么如何去区分不同的进程呢? 这里我们引入了一个新的东西,端口号.端口号区分了不同的进程,常见的如 80 http 69 tftp 23 telnet等等.传输层的协议有两个,udp和tcp,其中udp比较简单,仅仅在网络层的基础之上添加了端口号,udp头部有一个可选的校验和还有udp长度.udp的特点是无连接,花费较小,不可靠.
校验和是覆盖了整个udp头部和数据部分的,注意一点的事在计算校验和的时候会加上一个伪首部,伪首部包含了ip的一些字段,这个伪首部仅仅用来计算校验和,不发送.
进程的每一次输出操作都会产生一个udp数据报,当udp数据报大于路径MTU的时候,就会进行分片.
;另一个比较复杂的协议是tcp,tcp面向连接,提供了可靠性.tcp有超时重传机制,确认机制以及流量控制等机制来确保可靠性.
tcp除了拥有端口号之外,还拥有序号和确认序号,系统会分配一个随机的初始序号,没发送一个字节,这个序号就会+1,可以看做是对报文段中的字节进行计数,确认序号是用来发送给发送方的,表示已经接收到了那些序号,期待下一次收到的序号是多少开始的.
其中SYN标记位作为同步序号,在建立连接的时候使用,ACK标记位表示该报文是一个确认报文,FIN是一个终止连接的标记,PSH标志位表示要尽快把报文上交上去并清空缓存区域.
窗口大小可以理解为缓冲区的大小,当窗口为0的时候是无法去接受数据的.tcp的校验是必须的,计算方式与ip首部的计算方式一致,简单的求和.常见的选项有MSS,最大报文段,用这个数据来避免进行分片,确保可靠性.通常默认为536.
tcp的三次握手
首先由客户端发起请求,发送一个TCP报文,SYN置1,服务器收到之后回复一个报文,ACK置1,之后客户端再次回应ACK,连接建立成功.
四次挥手拆除连接,因为tcp是全双工的,因此拆除连接需要两个方向都进行拆除.
关于确认:
经受时延的确认,tcp收到报文之后,并不立即发送确认,而是会延迟一下,以便将确认和沿着该方向发送的数据一起发送,也叫数据捎带ACK
negle算法:
为了减少网络中的微小分组,tcp会先发送一个微小分组出去,然后收集其他的微小分组,收到确认的时候,再将这些分组一起发送出去.这个算法主要是为了改善网络环境.有时候在实时性要求较高的环境下需要关闭这个算法,比如鼠标的操作.
关于重传:
tcp有两种重传的机制,一个是超时重传,第二个是收到了重复的确认报文.
超时重传:tcp在发送完一个报文之后,会启动一个定时器,如果在定时器超时之前,没有收到确认报文,那么将进行重传.
快速重传:假设tcp一次发送了6个报文段,报文段1.2.3.5..6到了,报文段4丢了,这时候,对端就会一直发送对报文段3的确认报文,如果连续收到了三个这样的报文,那么久不用等到超时,直接就重传报文段4.收到了报文段4之后,才会确认报文段6. 注意 这个确认只会确认连续收到的报文段.