延迟应答
提高传输效率的机制,又是基于流量控制,来引入的提高效率的机制,把应答的时间往后拖一点,趁着这个时间来把欠的债补上一波
捎带应答
基于延迟应答的基础上引入的,典型的通信模型,一发一收
TCP中,只要把数据传过去,对方收到后,就会立刻由内核返回一个ACK确认报文,另外,响应数据,由应用程序里负责传输。
这俩操作是不同的时机传输的,因此不能把这两传输合并起来,但是因为有个延时应答,本来ACK需要立刻返回,结果延时应答导致稍等返回,此时业务上也需要返回这个响应,两个报文因此合二为一了。 但是两个操作合成一个的情况不是100%产生的
面向字节流
存在一个经典问题:粘包问题
例如接收到了 :好123
不确定完整响应是”好“ 还是”好123“
TCP自身对于应用数据报是无法区分的
UDP面向数据报。不存在这个问题,因为一个数据报对应一个应用层报文
只需要定义应用层数据协议的时候,明确包和包之间的边界就可以了。
可以通过分隔符,比如约定使用来作为包的结束标记(例如使用”;“符号来隔开)、
还可以通过指定包的长度,比如数据包开头位置指定长度。
TCP中的异常处理
连接异常
a.程序崩溃
相当于是进程的异常退出,操作系统会回收进程的资源,包括释放文件描述表,而这样的释放操作就相当于调用了对应socket的close,执行close就会触发fin报文,进一步开始四次挥手
b.正常关机(通过开始菜单这种方式来关闭主机)
关机的时候,系统会先强制结束所有的用户进程,和程序崩溃一样,进行文件描述符的释放操作后进一步开始四次挥手
c.主机掉电
掉电的是接收方,发送方不知道对面挂了,继续发送数据,发的数据没有ACK了,发送方触发超时重传,重传几次后仍然无应答,尝试重置链接(复位报文段),最后失败,放弃连接
掉线的是发送方,接收方没有收到后过了一段时间,会发送一个心跳包,心跳包是周期性触发的,只是一格简单的不携带任何业务数据的包,存在的意义就是确认一下对方是否还在,如果对方不返回心跳包,说明心跳遗失,说明对方挂了,此时也就放弃链接
IP地址具体规则
IP地址由两个部分组成,网络号和主机号,网络号是标识网段,保证相互连接的两个网段具有不同的标识,主机号是标识主机,同一网段内,主机号之间具有相同的网络号,但是必须有不同的主机号。
同一个局域网中,主机之间的网络号是相同的,主机号必须是不同的,在两个相邻的局域网中,要求网络号是不同的(同一个路由器连接的局域网)也就是WAN口和LAN口得有不同的网络号