知道对端的IP和端口号就直接进行传输,不需要建立连接;
没有任何安全机制,发送端发送数据报以后,如果因为网络故障该段无法发到对方,UDP协议层也不会给应用层返回任何错误信息;并且数据有没有发送给对方,应用层完全不知道
应用层交给UDP多长的报文,UDP原样发送,既不会拆分,也不会合并;
用UDP传输100个字节的数据:如果发送端一次发送100个字节,那么接收端也必须一次接收100个字节;而不能循环接收10次,每次接收10个字节。
UDP只有接收缓冲区,没有发送缓冲区:UDP没有真正意义上的 发送缓冲区。发送的数据会直接交给内核,由内核将数据传给网络层协议进行后续的传输动作;UDP具有接收缓冲区,但是这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一致;如果缓冲区满了,再到达的UDP数据就会被丢弃;UDP的socket既能读,也能写这个概念叫做 全双工
UDP协议首部中有一个16位的最大长度。也就是说一个UDP能传输的数据最大长度是64K(包含UDP首部)。
TCP 通过检验和、序列号、确认应答机制、超时重传机制、连接管理以及窗口控制等机制实现可靠性传输。
在 TCP 中,当发送端的数据到达接收主机时,接收端主机会返回一个已收到消息的通知,这个消息叫做确认应答(ACK)。
如果同时发送多份数据,如何确认对方收到的是哪一份数据?
TCP将每个字节的数据都进行了编号。即为序列号。
一个字节占一个序列号,初识序列号一般不是0,相对值可以记为0
每个标志位占一个bit
ASN要从收到的数据序列号的下一个序列号开始发送,并且ASN只有在ACK标志位=1时才具有意义
如果没有收到对方确认,假设对方是正常工作,这样的情况该如何处理?
序列号可以做到去重的效果,接收方可以通过SN判断是否重复收到相同的数据,此时接收方可以不接收重复数据,但是ACK还是需要发送的
重发也不会无脑重发,万一网络断了无论重发多少次都没有意义,一般是尝试几次收不到ACK就停止发送,不同的OS次数不同
TCP很少出现发送失败的情况,发送失败只可能是缓冲区里放不下数据了
客户端和服务器是在应用层的概念
主动连接方一般是客户端
syn segment:同步信息
第2次和第3次一般是同步的,同步信息时也同时可以确认信息
第一次握手:客户端发送syn包到服务器,并进入SYN_SENT状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN,同时自己也发送一个SYN包,即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK,此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。
将SYN和ACK同时置为1就表示第二次握手阶段
不能携带数据的原因是:不能确定连接成功,携带数据可能提高发送成本
ACK没有置为1,ASN确认序列号没有意义
len数据长度,三次握手阶段不携带数据,所以数据长度为0
建立连接阶段:
开始时:客户端与服务器都处于CLOSED状态,连接不存在也可以视为closed
主动挥手的一方不一定是主动连接的一方
握手时必须双方同意,但是挥手可以是单方面的
四次挥手的变形情况:
同时挥手不一定是实际意义上同一时刻,而是一方提出挥手,在另一方收到挥手信息之前也发出挥手的信息
主动回收方:状态变化图中橙色线
被动挥手方:状态变化图中红色线
变形情况状态位变化:
被动挥手方发既发了ACK也发了FIN,所以CLOSE_WAIT是短暂的,会马上变为LAST_ACK状态
出现在被动方:对方提分手,我还没有分手,单方面挥手
不直接进入closed状态而是time_wait是因为可能发生超时重发现象,不能保证最后一次ack数据包一定发送给对方
类似的现象:
2*msl之后segment一定到达对方的时间一定够了
网络编程设计主要是让客户端关闭连接
进程是资源分配的最小单位(OS知道分配了什么资源给进程),即使强制关闭进程,没有在进程内部中关闭TCP连接,但是OS还是会正常释放资源,关闭TCP连接,可以看做是甲主动断开连接,正常四次挥手
点击重启或者关机还是会执行操作系统代码,会正常关闭所有进程和资源,正常的四次挥手。只要操作系统代码还能正常执行就可以正常关闭
接收端认为连接还在,一旦接收端有写入操作,接收端发现连接已经不在了,就会进行reset。即使没有写入操作,TCP自己也内置了一个保活定时器,会定期询问对方是否还在。如果对方不在,也会把连接释放。
接收端的状态:收不到确认应答,即使超时重传也收不到应答,接收端就会进行异常关闭流程
发送端直接断电,到接收端异常断开TCP连接并不是瞬时的。如果接收端不写入数据,TCP中还存在一个保活定时器Keepalive来判断连接还是否存在。
netstat:查看网络状态
查看进程PID占用TCP哪一个端口
过滤操作:
TCP根据接收端接收数据的能力决定发送端的发送速度
接收端将自己接收缓冲区大小放入Segment Header中的16位窗口大小中发送给发送端
接收窗口=接收缓冲区大小-已用大小
三次握手阶段可以接收接收端的窗口大小
第一种情况:应用层写入多少数据就发送多少数据
第二种情况:只发送部分数据
发送的数据不一定全部应答
过程中收到了对方的应答:发送且应答数据无需保留,可以视为可用空间
对每一个发送的数据段,都要给一个ACK确认应答。收到ACK后再发送
下一个数据段。这样做有一个比较大的缺点,就是性能较差。尤其是数据往返的时间较长的时候。
在三次握手之后一定会受到接收端窗口大小
应用层写入1500个单位大小数据
对方窗口大小为1000,发送端此时发送500个单位大小的数据给接收端:
接收端只应答了300个单位大小的数据,并返回900个单位大小的窗口,另外200个单位大小的数据可能被应用层读走。
此时滑动窗口大小发生改变:从300的起始位置,加上返回的窗口大小900,到达1200的位置,此次发送数据为900,图中剩余未应答200紫色部分的可能还在发送途中,这200的数据也包含在900中。
此时应用层在写入300数据:并收到应答500,窗口大小为1000
可以看出滑动窗口左边界是根据ASN确定,右边界根据ASN+Window大小确定
流量控制:TCP根据接收端处理数据的能力,来决定发送端发送数据的速度,这种机制就叫做流量控制
TCP三个特点:可靠,有连接,面向字节流(TCP是为了可靠性才放弃面向报文的特点)
TCP Segment Header补充:
16位校验和:校验和不争取就直接把数据丢了,丢了不给应答,发送端还会重发数据过来
三次握手———建立连接————四次挥手
状态是持续一段的时间,而不是一个时间点
状态转移图:
滑动窗口的变化条件:
加速机制:当接收方不断发送相同ASN,说明这个数据一定丢失了,直接跳过超时等待时间,直接进行数据重发
窗口探测:即使没有数据的发送,每隔一个定期的时间都会发送一个窗口探测
延迟应答、捎带应答:
UDP:业务对时间要求高,应用层不需要保证可靠性
在UDP应用层抄袭TCP保证可靠性的机制
常见协议:
IP地址(Internet Protocol Address)是指互联网协议地址,又译为网际协议地址
IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节),如:01100100.00000100.00000101.00000110。
通常用“点分十进制”的方式来表示,即 a.b.c.d 的形式(a,b,c,d都是0~255之间的十进制整数)。如:100.4.5.6。
IP地址的组成:网络号+主机号
网络号:标识网段,保证相互连接的两个网段具有不同的标识
主机号:标识主机,同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号
子网掩码格式和IP地址一样,也是一个32位的二进制数。其中左边是网络位,用二进制数字“1”表示,1的数目等于网络位的长度;右边是主机位,用二进制数字“0”表示,0的数目等于主机位的长度。
/3表示32位子网掩码前三位是1,后面全是0
ip地址&网络掩码=网络号
ip地址&(~网络掩码)取反操作=主机号
将IP地址中的主机地址全部设为0,就成为了网络号,代表这个局域网;
将IP地址中的主机地址全部设为1,就成为了广播地址,用于给同一个链路中相互连接的所有
主机发送数据包;
127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1
本机环回主要用于本机到本机的网络通信(系统内部为了性能,不会走网络的方式传输),
对于开发网络通信的程序(即网络编程)而言,常见的开发方式都是本机到本机的网络通
信。
内网和外网建立信道可以,但是外网向内网建立信道就不可行!
路由表:将长期目标改为短期目标,路由表可以存在主机上也能存在路由器上
4位版本号(version):指定IP协议的版本,对于IPv4来说,就是4。
4位头部长度(header length):IP头部的长度是多少个32bit,也就是 length 4 的字节数。4bit表示最大的数字是15,因此IP头部最大长度是60字节。用于解包。
8位服务类型(Type Of Service):3位优先权字段(已经弃用),4位TOS字段,和1位保留字段(必须置为0)。4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。这四者相互冲突,只能选择一个。对于ssh/telnet这样的应用程序,最小延时比较重要;对于ftp这样的程序,最大吞吐量比较重要。比如最小延时:数据直接发送
16位总长度(total length):IP数据报整体占多少个字节。
8位生存时间(Time To Live,TTL):数据报到达目的地的最大报文跳数。一般是64。每次经过一个路由,TTL -= 1,一直减到0还没到达,那么就丢弃了。这个字段主要是用来防止出现路由循环。
8位协议:表示上层协议的类型。
16位头部校验和:使用CRC进行校验,来鉴别头部是否损坏。
32位源地址和32位目标地址:表示发送端和接收端。
选项字段(不定长,最多40字节):略。
TTL:即使形成环路,ip包也不可能无限循环传递下去,还会影响到上层传输层中MSL
16位标识(id):唯一的标识主机发送的报文。如果IP报文在数据链路层被分片了,那么每一个片里面的这个id都是相同的。
3位标志字段:第一位保留(保留的意思是现在不用,但是还没想好说不定以后要用到)。第二位置为1表示禁止分片,这时候如果报文长度超过MTU,IP模块就会丢弃报文。第三位表示"更多分片",如果分片了的话,最后一个分片置为0,其他是1。类似于一个结束标记。
13位分片偏移(framegament offset):是分片相对于原始IP报文开始处的偏移。其实就是在表示当前分片在原报文中处在哪个位置。实际偏移的字节数是这个值 * 8 得到的。因此,除了最后一个报文之外,其他报文的长度必须是8的整数倍(否则报文就不连续了)
version=4 ip协议版本为ipv4
identification:0x003b 16位标识符,如果ip包分片的标识
time to live=128不同的OS有不同的寿命,使用ping命令
tracert+ip地址,可以列出详细的经过的跃点ip地址
MAC地址:用于标识网络设备的硬件物理地址
主机具有一个或多个网卡,路由器具有两个或两个以上网卡;其中每个网卡都有唯一的一个MAC地
址。
网络通信,即网络数据传输,本质上是网络硬件设备,将数据发送到网卡上,或从网卡接收数据。
硬件层面,只能基于MAC地址识别网络设备的网络物理地址。
三个路由器连接两个局域网。根据源ip地址和目标ip地址,第一个路由器根据路由表换算出短期目标源mac1地址,目标mac2地址,上层协议:IP协议,这是在物理介质上传输。
广播数据报:发送一个广播数据报,表示对同网段所有主机发送数据报。广播数据报的MAC地址为:
FF:FF:FF:FF:FF:FF
ARP协议建立了主机 IP地址 和 MAC地址 的映射关系
arp -a命令查看同一局域网内其它mac地址
此时应用层写入"apple"封装到TCP中
传输层:添加序列号,源端口,目标端口
网络层:ip地址
数据链路层:mac地址
以上封装为一个以太网帧,网卡经过传输介质(物理介质)发送到局域网的路由器,路由器
TCP/IP中使用IP地址来确定网络上的一台主机,但是IP地址不方便记忆,且不能表达地址组织信息,于是人们发明了域名,并通过域名系统来映射域名和IP地址。
没有严格层次划分,不同的内网可以有相同的ip地址,但是相同ip地址发数据到公网,ip地址必须唯一,此时就需要NAT协议将网络地址转换。
内网ip地址不可以上公网
NAT职责就是将内网的IP地址和端口映射成为公网IP和公网端口,NAT内部记录这个映射关系。