首先TCP是:有连接 可靠传输 面向字节流 全双工
UDP是:无连接 不可靠传输 面向字节报 全双工
TCP前面是有16位源端口和16位目的端口号,后面是32位序号(用来确认应答的)和32位确认序号,再往后是4位首都长度6个特殊的标志位(其中就有ack acknowledge确认应答机制)和校验和等等
一.确认应答机制
通过确认应答机制可以确保数据传输的可靠性,(这是TCP可靠性最核心的机制)
当一个数据报通过网络传输时,是通过把数据转换成光电信号,物理方式来传输的,一旦数据传输过程中出现物理意外,强电场磁场等破坏信号,可能出现"后发先至",后发的信息先到达,而这就需要一个确认应答机制来,一旦两次消息出现的顺序不一致,就会出现bug,应对方法就是针对请求和应答报文进行编号
,而这里的编号就是前面TCP协议里面的32位序号的作用,后面的32位确认序号就是用来确认应答的.
但是在传输过程中,A给B传输,A收到的信息有两条一样的,就会出现下面的超时重传现象
二.超时重传
如果数据包丢了,就会出现超时重传,通信双方第一次传输数据报是,会有有个应答的ack,但如果信息到达对方的时间比预期时间要久,最后还是会到达,也就会出现丢包,出现了延迟的现象.由于上面的确认应答机制,发送方可能重复发送一次数据或者接收方收到一次数据之后,发送ack应答一次丢包了,但是又发了一次应答,那么第一次的重复消息就会 根据确认序号来去重
三.连接管理
主要是三次握手,四次挥手机制
三次握手这里,理论上是发送方询问数据是否连接,接收方回复ack应答,同时有反问一个是否收到,发送方再回复收到.这样的四次连接,由于其中第二次和第三次时间上同时发送,也就省略了一次(合并成一次发送了),而四次挥手这里中间两次的时间和程序的设定有关,并不是有操作系统内核决定的.
说到这里不由得分析一下连接管理是为了什么:
1.提前确认了通信双方传输数据是正常的
2.检查了传输方和接收方的网络正常(不会丢包)
3.提前统一一下一些重要的参数
TCP里面比较重要的状态:
LISTEN(listen):服务器刚启动,可以正常通信的状态(刚new ServerSocket)
ESTABLISHED(established):通信双方刚刚建立连接的状态
COLES_WAIT(close_wait):等待代码中调用close操作
TIME_WAIT(time_wait):通信完成之后,接收和发送方 主动发送关闭的一方的状态,也是为了最后一个ack应答丢包了,没传出去,可以重新传输一次做准备
如果此时接收方想要断开连接传了个FIN之后,没见回复,就会再传一次FIN来等待对方传来ack