Linux网络编程-TCP相关知识

线程同步

在这里插入图片描述

与时间有关的、空间有关,资源共享、调度随机、缺乏必要的同步机制。
在这里插入图片描述

协议

是一组规则,学习它的规范,按它的规范写代码。比如双方规定先发什么后发什么,先发文件名,再发大小最后发内容。
在这里插入图片描述

典型协议

传输层:TCP、UDP

分层模型结构:

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位),滑动窗口是为了向对方说明自己的缓冲区大小,就是两主机间的通信不可能是一来一回那么协调的,一般会像下面这样,发送方发数据包会发送到对方窗口最大值才停下来,接收方则是连续接受再返回确认报文。此即滑动窗口。
cdsacd

四次挥手

一方先发FIN报文,另一方接收后发送ACK报文,发送端断开写缓冲区,半关闭完成。此时socket仍然保存,另一方再发送FIN报文,接收端发送ACK报文,此即另一个半关闭,从此此socket关闭完成。

TCP通信时序

在这里插入图片描述

TCP通信双方的状态转换图

在这里插入图片描述
这些个状态可以通过命令:netstat -apn | grep 8000(端口号)来具体查看。
在这里插入图片描述

在这里插入图片描述
如果是服务器先关闭,会导致那个端口号处于time_wait状态,从而bind()函数出错。
TIME_wait状态是在第四次挥手是,如果对方没有收到ACK报文则会不断发送FIN报文过来,这个时间段就是为了等待着FIN报文,以确保四次挥手完成。即保证最后一个ACK报文能被收到。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值