网络编程笔记

本文详细介绍了TCP/IP协议,包括TCP在IP协议之上的作用,确保数据完整性的机制,如慢启动和可变发送窗口。此外,还阐述了端口号在识别不同应用程序中的角色,以及TCP的三次握手和四次挥手过程,确保连接的建立与断开。最后讨论了数据可靠传输的策略和重传机制,如超时重传和快速重传。
摘要由CSDN通过智能技术生成

一.TCP协议

在很多情况下,它只是利用 IP 进行通信时所必须用到的协议群的统称。TCP/IP 为网际协议群或者互联网的协议。具体来说,IP 或 ICMP、TCP 或 UDP、TELNET 或 FTP、以及 HTTP 等都属于 TCP/IP 协议。

TCP 是以太网协议和 IP 协议的上层协议,也是应用层协议的下层协议。

以太网协议解决了局域网的点对点通信。但是,以太网协议不能解决多个局域网如何互通,这由 IP 协议解决。IP 协议只是一个地址协议,并不保证数据包的完整。如果路由器丢包(比如缓存满了,新进来的数据包就会丢失),就需要发现丢了哪一个包,以及如何重新发送这个包。这就要依靠 TCP 协议。
这里写图片描述

详见:五分钟读懂TCP 协议——TCP协议简介_Bigstar的博客-CSDN博客_tcp协议
简单说,TCP 协议的作用是,保证数据通信的完整性和可靠性,防止丢包。

TCP 协议为了做到效率与可靠性的统一,设计了一个慢启动(slow start)机制。开始的时候,发送得较慢,然后根据丢包的情况,调整速率:如果不丢包,就加快发送速度;如果丢包,就降低发送速度。

Linux 内核里面设定了(常量TCP_INIT_CWND),刚开始通信的时候,发送方一次性发送10个数据包,即发送窗口”的大小为10。然后停下来,等待接收方的确认,再继续发送。默认情况下,接收方每收到两个 TCP 数据包,就要发送一个确认消息。”确认”的英语是 acknowledgement,所以这个确认消息就简称 ACK

ACK 携带两个信息:
1.期待要收到下一个数据包的编号
2.接收方的接收窗口的剩余容量123

发送方有了这两个信息,再加上自己已经发出的数据包的最新编号,就会推测出接收方大概的接收速度,从而降低或增加发送速率。这被称为发送窗口,这个窗口的大小是可变的。

img
img
总结TCP服务端编写步骤,如下:

  1. 调用socket函数创建套接字。
  2. 调用bind函数给创建的套接字命名,分配IP地址和端口。
  3. 调用listen函数进行监听,等待客户端连接。
  4. 调用accept函数接受新的连接,做好相互通信准备。

二.端口号

数据链路和 IP 中的地址,分别指的是 MAC 地址和 IP 地址

前者用来识别同一链路中不同的计算机,后者用来识别 TCP/IP 网络中互连的主机和路由器。端口号用来识别同一台计算机中进行通信的不同应用程序。因此,它也被称为程序地址。

传输层协议正是利用这些端口号识别本机中正在进行通信的应用程序,并准确地将数据传输。端口号由其使用的传输层协议决定。因此,不同的传输层协议可以使用相同的端口号。

在UDP/IP协议中,用源IP地址 + 源端口号 + 目的IP地址 + 目的端口号 + 协议号(组成的套接字),这样一个五元组来标识一个通信(通过netstat -n 查看)

1.从网络层来说,通信的是两个主机(两个局域网),IP数据报的首部明确标志了这两台主机的IP地址,真正需要通信的是两台主机上的进程

2.从运输层来看,通信的真正端点并不是主机而是“主机的进程”。

传输层和网络层的明显区别是:网络层为主机之间提供逻辑通信,而运输层提供端到端的逻辑通信。

ip地址是用来标志服务器的。但是一个服务器上会有很多个程序同时使用网络,那怎么保证他们的网络包不串线?端口号就入场了,它是0-65535之间的一个数字。服务端是监听一个固定的端口,这样客户端在连接的时候都知道该连哪个应用。

img
详见:什么是端口号?_l477918269的博客-CSDN博客_端口号是什么

三.TCP的三次握手

TCP将若干个字节构成一个分组,叫报文段(Segment),TCP报文段封装在IP数据报中,数据可在同一时间双向传输。

TCP建立连接的过程称为三次握手

1.PC1发送SYN报文(Seq=x,SYN=1

2.PC2发送SYN+ACK报文(Seq=y,Ack=x+1SYN=1, ACK=1

3.PC1发送ACK报文(Seq=x+1,Ack=y+1,ACK=1
在这里插入图片描述
在三次握手的时间轴中,不同的时间,接收方和发送方有不同的状态:

1.在接收方没有接收到数据之前,它一直处于监听状态(Listen)
2.发送方在第一个报文发送出去,到接收到第一个报文的响应之间,属于同步已发送状态(SYNC- SENT),表示已经将SYN发送出去了,并且等待对方的SYN信息
3.第二次握手完成后,发送方进入建立连接(ESTABLISHED)的状态了
4.接收方只有在接收到发送方的ACK报文后(第三次握手完成后),才能进入建立连接(ESTABLISHED)的状态
详见:
1.https://blog.csdn.net/qq_43613793/article/details/120181519
2.通俗易懂理解TCP协议三次握手和四次挥手及其常见问题_impact_factor的博客-CSDN博客_tcp三次握手

四.TCP的四次挥手

1.PC1发送FIN/ACK(FIN=1,ACK=1)

2.PC2发送ACK报文(ACK=1)

3.PC2发送FIN/ACK(FIN=1,ACK=1)

4.PC1发送ACK报文(ACK=1)

在这里插入图片描述
A.发送FIN数据包,代表A不在发送数据
B:收到请求,开始应答,避免了A重新发送FIN重试**(应答机制)**
B:处理完数据之后关闭,关闭连接以发送FIN请求
A:收到请求后发送ACK应答,B服务可以释放连接

等待2MSL以后释放连接的原因:
1.防止报文丢失,导致B重复发送FIN。
2.防止滞留在网络中的报文,对新建立的连接造成数据扰乱。

五.具体2MSL

1.四次挥手释放连接时,等待2MSL的意义?
(MSL可译为“最长报文段寿命”,它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。)
两个理由:
1)保证客户端发送的最后一个ACK报文段能够到达服务端
为了保证客户端发送的最后一个ACK报文段能够到达服务器。因为这个ACK有可能丢失,从而导致处在LAST-ACK状态的服务器收不到对FIN-ACK的确认报文。服务器会超时重传,这个FIN-ACK,接着客户端再重传一次确认,重新启动时间等待计时器。最后客户端和服务器都能正常的关闭。假设客户端不等待2MSL,而是在发送完ACK之后直接释放关闭,一但这个ACK丢失的话,服务器就无法正常的进入关闭连接状态。

2)防止“已失效的连接请求报文段”出现在本连接中
客户端在发送完最后一个ACK报文段后,再经过2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失,使下一个新的连接中不会出现这种旧的连接请求报文段。

2.为什么TIME_WAIT状态需要经过2MSL才能返回到CLOSE状态?
理论上,四个报文都发送完毕就可以直接进入CLOSE状态,但是可能网络是不可靠的,有可能最后一个ACK丢失所以TIME_WAIT状态就是用来重发可能丢失的ACK报文
详见:https://blog.csdn.net/str_lyc/article/details/109543525

六.数据可靠性传输

TCP主要提供了检验和、序列号/确认应答、超时重传、最大消息长度、滑动窗口控制,拥塞控制等方法实现了可靠性传输。
在这里插入图片描述

七.重传机制

常见的重传机制:1)超时重传 2)快速重传 3)SACK 4)D-SACK
而所有重传的机制都需要依赖通过序列号Seq与确认应答ACK。在 TCP 中,当发送端的数据到达接收主机时,接收端主机会返回一个确认应答消息,表示已收到消息。
四种重传机制此处不多赘述。

在这里插入图片描述
在这里插入图片描述
这两种都效率低下,所以有滑动窗口协议与累计确认(延时ack),滑动窗口大小同通过TCP三次握手和对端协商,但是受网络状况的影响。

此博客仅作为个人学习笔记,侵删呜呜(´థ౪థ)σ

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 很抱歉,我是AI语言模型,无法提供自己的笔记。但是,我可以为您提供一些关于Linux网络编程的信息。Linux网络编程是指在Linux操作系统上进行网络编程的技术,主要包括socket编程、网络协议网络编程模型等内容。在Linux网络编程中,常用的编程语言有C、C++、Python等。Linux网络编程的应用非常广泛,可以用于开发各种网络应用程序,如Web服务器、邮件服务器、FTP服务器等。同时,Linux网络编程也是网络安全领域的重要技术之一,可以用于网络攻防、数据加密等方面。 ### 回答2: Linux网络编程是一门高级语言编程,包括了网络以及套接字的知识,它的目的是让开发者能够在Linux系统下进行网络应用程序的开发与运行。Linux网络编程中,主要涉及到如下的知识: 1.网络协议:网络协议是数据在计算机网络内传输时所必须遵循的规则和约定。网络协议的共同目标是确保数据的可靠传输。 2.套接字:套接字是一种在网络编程中广泛使用的编程接口,它允许从一个进程向另一个进程通信。通过套接字的编程,可以实现网络上的客户端和服务器端的通信。 3.套接字选项:在套接字编程中,选项提供了一些可选项来控制套接字的行为。例如,可以使用SO_REUSEADDR选项来允许相同的IP地址和端口被多个套接字所使用,或者使用SO_LINGER选项来控制套接字在关闭时的行为。 4.网络编程的主要函数:对于网络编程而言,大多数使用的函数都是socket编程或一些与之相关的函数。如socket、bind、listen、accept、connect、send、recv等。 5.多线程编程和select函数:在网络编程中,常常需要使用多线程编程来同时处理多个套接字,使程序具有高并发性。而select函数可以在一个线程中监听多个套接字的I/O事件,从而优化服务器的性能和响应速度。 6.网络编程的实际应用:网络编程在实际应用中,可以实现许多有趣的功能。例如,可以创建简单的聊天程序、实现网络文件传输、远程控制、实现P2P通信等。 总之,Linux网络编程是一种非常重要的技术,要学习并掌握这门技术,需要掌握网络协议、套接字、多线程编程等基础知识。掌握这些知识后,开发者可以根据实际需求,灵活地使用网络编程技术来实现各种基于网络的应用程序。 ### 回答3: Linux网络编程在现代软件开发中扮演着非常重要的角色,这是因为它是一种跨平台的操作系统,并且为开发人员提供了良好的网络编程接口。以下是一些重要的技术和笔记: 1. 套接字(socket)编程—— 在Linux环境中,套接字是网络编程的关键要素。它被用于实现客户端/服务器应用程序中的通信,例如Web服务器和聊天室应用程序。在编写套接字程序时,必须使用包括bind,listen和accept等操作来处理连接请求。 2. 网络协议—— Linux支持各种网络协议,例如TCP/IPUDP,ICMP,ARP和RIP等。其中TCP/IP是最常用的网络协议,因为它可靠且易于使用,在开发网络应用程序时需要具备其相关知识,例如TCP连接管理和协议数据包的格式化。 3. 多线程编程—— 在Linux环境中,多线程编程是一种非常重要的技术,可以同时处理多个网络请求,以提高应用程序的性能。通常使用POSIX线程库(pthread)来实现多线程编程,并使用同步和互斥机制来管理线程访问共享变量的冲突。 4. 网络安全—— 网络安全是Linux网络编程的一个重要方面,因为网络应用程序通常需要保护敏感数据和隐私信息。开发人员必须学习诸如SSL和TLS等加密协议,以确保数据传输的安全性。 总结来说,在Linux环境下进行网络编程需要熟悉套接字编程、网络协议、多线程编程和网络安全等技术。这些技术的结合可以实现高效的网络应用程序,并提高用户体验。在掌握这些技术后,开发人员可以将网络编程应用于Web服务器、聊天室应用程序、数据存储器等各种应用程序。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值