线程同步
与时间有关的、空间有关,资源共享、调度随机、缺乏必要的同步机制。
协议
是一组规则,学习它的规范,按它的规范写代码。比如双方规定先发什么后发什么,先发文件名,再发大小最后发内容。
典型协议
分层模型结构:
OSI七层模型:open system interconnection,内容:物、数、网、传、会、表、应。 编写程序一般用:TCP/IP4层模型:网络接口层(物理层、数据链路层)、网络层、传输层、应用层(会话层、表示层、应用层)。 应用层:http,ftp,nfs,ssh,telnet 传输层:tcp,udp 网络层:IP,ICMP,IGMP 链路层:以太网帧协议,ARP协议
c/s模型:client-server b/s模型:browser-server
c/s模型
优点:可缓存大量数据、协议选择灵活(自己封装协议)、速度快 缺点:安全性、不跨平台、开发工作量大
b/s模型
优点:安全性高、跨平台、开发工作量较小 缺点:不能缓存大量数据、严格遵守http协议
通信过程
必须对数据进行封装才能传输,逐层向下。 分别应用层、传输层、网络层、数据链路层各层封装,到达之后逆序解封。
以太网帧和ARP请求
源地址是自己主机的mac地址,然后目的地址需要查询ARP协议得到。 ARP地址:根据IP地址查找MAC地址。 查询方式: ff:ff:ff:ff:ff:ff-源主机mac地址-0806-8字节-源主机mac地址-源主机IP地址-ff:ff:ff:ff:ff:ff-对方IP地址 ,发送到路由器,路由器里面有路由表,路由器发一个广播,每个收到的都会比对最后的ip地址,如果对上,则应答即往回发。
ip地址
版本:ipv4,ipv6 TTL:time to live:设置数据包在路由节点的跳转上线,每经过一个路由节点,该值减一,减为0的路由,有义务将其丢弃。 源IP:32位 ---- 4字节 目的IP:32位 ---- 4字节
IP地址:可以在网络环境中,标识一台主机。 端口号:可以在网络的一台主机上,唯一标识一个进程。 IP地址+端口号:可以在网络环境中,唯一标识一个进程。
UDP
16位:源端口号 2^16=65536 16位:目的端口号 2^16=65536
TCP
16位:源端口号 2^16=65536 16位:目的端口号 2^16=65536 32位序号: 32位确认序号: 6个标志位: 16位窗口大小:
网络套接字
一个文件描述符指向一个套接字,成对出现。
网络字节序
大小端存贮,网络字节序用的是大端字节序。 ip地址转换函数: af指定协议类型:AF_INET src:传入,IP地址 dst:传出,转化后的字节序ip地址。 size:dst的大小 返回值: 成功:1 异常:0,说明src执行的不是有效地址 失败:-1
三次握手
假设客户端先给服务器发送报文。 首先,客户端给服务器发送SYN报文,序列号假设为100,此即第一次握手;服务器收到后会向客户端发送ACK报文,此ACK报文里,确认序列号为101,序列号假设为800,此即第二次握手;客户端收到ACK报文后,也会向服务器发送一个ACK报文,序列号为101,确认序列号为801,此即第三次握手。第三次握手里有个细节需要注意,就是:第三次握手可能带有数据,也可能不带有数据。进行第三次握手时,客户端已经建立好连接,向服务器发送的ACK报文不带数据,然后发完ACK报文一般会立即发送数据报文。这其中的情况是ACK报文可能没有到达服务器,则数据报文除了带有数据外,还应该确认序列号为801。此数据报到达服务器也可代表成功完成第三次握手,也就是说第三次握手可能会带有数据。
滑动窗口
TCP数据报头里面有源和目标ip(32位),序列号(32)、确认序列号(32位),六个标志位(6位),校验和(16位),滑动窗口大小(16位),滑动窗口是为了向对方说明自己的缓冲区大小,就是两主机间的通信不可能是一来一回那么协调的,一般会像下面这样,发送方发数据包会发送到对方窗口最大值才停下来,接收方则是连续接受再返回确认报文。此即滑动窗口。
四次挥手
一方先发FIN报文,另一方接收后发送ACK报文,发送端断开写缓冲区,半关闭完成。此时socket仍然保存,另一方再发送FIN报文,接收端发送ACK报文,此即另一个半关闭,从此此socket关闭完成。
TCP通信时序
TCP通信双方的状态转换图
这些个状态可以通过命令:netstat -apn | grep 8000(端口号) 来具体查看。
如果是服务器先关闭,会导致那个端口号处于time_wait状态,从而bind()函数出错。
|