ip地址:
IP是Internet Protocol(网际互连协议)的缩写,是TCP/IP体系中的网络层协议。设计IP的目的是提高网络的可扩展性:一是解决互联网问题,实现大规模、异构网络的互联互通;二是分割顶层网络应用和底层网络技术之间的耦合关系,以利于两者的独立发展。根据端到端的设计原则,IP只为主机提供一种无连接、不可靠的、尽力而为的数据报传输服务。
端口号:
所谓的端口,就好像是门牌号一样,客户端可以通过ip地址找到对应的服务器端,但是服务器端是有很多端口的,每个应用程序对应一个端口号,通过类似门牌号的端口号,客户端才能真正的访问到该服务器。为了对端口进行区分,将每个端口进行了编号,这就是端口号
网络字节序列:
网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian(大端)排序方式。
常见网络协议:
1.应用层协议
这些协议主要有 FTP、 TFTP、 HTTP、 SMTP、 DHCP、 Telnet、 DNS 和 SNMP 等。
FTP(File TransportProtocol,文件传输协议)是网络上两台计算机传送文件的协议,运
行在 TCP 之上,是通过 Internet 将文件从一台计算机传输到另一台计算机的一种途径。
TFTP(Trivial FileTransfer Protocol,简单文件传输协议)是用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。
HTTP(Hypertext TransferProtocol,超文本传输协议)是用于从 WWW 服务器传输超文
本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。
SMTP(Simple Mail TransferProtocol,简单邮件传输协议)建立在 TCP 之上,是一种提
供可靠且有效的电子邮件传输的协议。 SMTP 是建模在 FTP 文件传输服务上的一种邮件服
务,主要用于传输系统之间的邮件信息,并提供与电子邮件有关的通知。
DHCP(Dynamic HostConfiguration Protocol,动态主机配置协议)建立在 UDP 之上,是
基于客户机/服务器模型设计的。
Telnet(远程登录协议)是登录和仿真程序,建立在 TCP 之上,它的基本功能是允许用
户登录进入远程计算机系统。
DNS(Domain NameSystem,域名系统)在 Internet 上域名与 IP 地址之间是一一对应
的,域名虽然便于人们记忆,但机器之间只能互相识别 IP 地址,它们之间的转换工作称为
域名解析.
SNMP(Simple NetworkManagement Protocol,简单网络管理协议)是为了解决 Internet
上的路由器管理问题而提出的,它可以在 IP、 IPX、 AppleTalk 和其他传输协议上使用。 SNMP是指一系列网络管理规范的集合,包括协议本身、数据结构的定义和一些相关概念。目前,
SNMP 已成为网络管理领域中事实上的工业标准,
2.osl 7层模式与tcp/ip协议4层模型
https://blog.csdn.net/winycg/article/details/75127113
3.Tcp服务器客户端编程流程熟练掌握
1)listen()第二个参数的意义
https://www.cnblogs.com/ztteng/p/5147156.html
2)connect()作用,如何防止connect长时间阻塞
1.因为UDP可以是一对一,多对一,一对多,或者多对多的通信,所以每次调用sendto()/recvfrom()时都必须指定目标IP和端口号。通过调用connect()建立一个端到端的连接,就可以和TCP一样使用send()/recv()传递数据,而不需要每次都指定目标IP和端口号。但是它和TCP不同的是它没有三次握手的过程。
2.还可以通过在已建立连接的UDP套接字上,再次调用connect()实现以下功能:
a.指定新的IP地址和端口号。
b.断开连接。
这也与TCP有所不同,TCP套接字只能调用一次connect()函数。
如何防止:
https://blog.csdn.net/hj605635529/article/details/74157305
3)accept()作用
accept()函数仅被TCP类型的服务器程序调用,从已完成连接队列返回下一个建立成功的连接,如果已完成连接队列为空,线程进入阻塞态睡眠状态。成功时返回套接字描述符,错误时返回-1。
如果accpet()执行成功,返回由内核自动生成的一个全新socket描述符,用它引用与客户端的TCP连接。通常我们把accept()第一个参数成为监听套接字(listening socket),把accept()功能返回值成为已连接套接字(connected socket)。一个服务器通常只有1个监听套接字,监听客户端的连接请求;服务器内核为每一个客户端的TCP连接维护1个已连接套接字,用它实现数据双向通信。
4)send()执行成功是否说明数据已经被成功发送到对端了
https://blog.csdn.net/shanshanhi/article/details/60867340
5)粘包问题,如何解决粘包问题
解决:
https://www.cnblogs.com/zhouxuchong/p/11576275.html
方法一:定长数据流
服务器客户端提前协商,每个消息定长,不足的空白字符补足
方法二: 特殊结束符
双方协商定义一个特殊的分隔符号 比如@ # $_$等 只要没有发送分隔符就意味着一条数据没有结束
方法三:协议
相对最成熟额数据传递方式,由服务器开发者提供固定格式的协议标准,双方都按照协议进行发送接收数据的。
6)如何查看接受缓冲区有多少字节未读区
在csdn这个论坛中有讨论到:
https://bbs.csdn.net/topics/350028141?list=4122
tcp:有连接的,流式,可靠,一对一
udp:无连接的,数据报,不可靠,一对多,一对一
1)什么时候开始进行三次握手
1.第一次握手,发送SYN报文,传达信息:“你好,我想建立连接”;
第二次握手,回传SYN+ACK报文,传达信息:“好的,可以建立链接”;
第三次握手,回传ACK报文,传到信息:“好的,我知道了,那我们连接”。然后就建立连接了。
2.在发送报文之前各方都要确认可以进行连接。之所以采取三次握手机制,不过是为了信息传输的可靠性,如果其中某个握手失败,这个过程将会重复,来确保其可靠性。
3.如果采取两次握手,相当于第二次握手结束便建立连接,如果发送SYN的一方不想连接了,也不会有反馈,另一方却一直在等待,浪费了时间。当然可以采取4次甚至N次握手,但是有必要吗?建立连接的时间太长,效果也会大打折扣。所以3次只是折中方案,保证了可靠性,又节俭了建立连接的时间。
2)那个阶段容易受到攻击
TCP三次握手在第二阶段容易受到攻击,即syn溢出攻击,如果客户机伪造出大量第一次的sys同步报文,服务端就会依次消耗掉很多资源来保存客户端的信息,并进行确认,实际上确认是会失败的,但失败需要一定的时间,因为服务端会连续多次进行第二次握手确认后才认定失败。那么短时间有大量的sys同步报文涌向服务端,服务端资源可能被耗尽,就可能导致正常的客户端得不到响应而失败。
https://blog.csdn.net/Kobe51920/article/details/103171477
我之前的博客中已经提到过:
https://blog.csdn.net/Kobe51920/article/details/103171477
什么时候会TIME_WAIT
TCP在关闭的时候有个四次挥手的过程,主动关闭方在四次挥手的最后一个ACK发送之后会变成TIME_WAIT状态。
主动关闭方
跟握手不同,挥手可以由客户端发起,也可以是服务端发起。发起关闭的一端我们称之为主动关闭方,另一端称之为被动关闭方。
四次挥手
TIME_WAIT状态维持多久
主动关闭方响应完最后一次ACK之后,会在TIME_WAIT这个状态维持2MSL。
MSL
MSL全称是maximum segment lifetime,最长分节生命期。MSL是任何IP数据报能够在因特网存活的最长时间。我们知道,这个时间是有限的,因为每个数据报都含有一个限跳(hop limit)的8位字段,它的最大值是255(简单的讲就是不同经过超过255个路由器)。尽管这个跳数限制而不是真正的时间限制,我们仍然假设最大限跳的分组在网络中存在的时间不可能超过MSL秒。
MSL的具体值通常为30秒或者是2分钟。
为什么需要TIME_WAIT
可靠地实现了TCP全双工连接的终止
我们知道,TCP是比较可靠的。当TCP向另一端发送数据时,他要求对端返回一个确认(如同我们关闭时候的FIN和ACK)。如果没有收到确认,则会重发。
回忆一下我们最终的那个FIN与ACK,被动关闭方发送FIN,并等待主动关闭方返回的ACK。我们假设最终的ACK丢失,被动关闭方将需要重新发送它的最终那个FIN,主动关闭方必须维护状态信息(TIME_WAIT),以允许它重发最终的那个ACK。
如果没有了这个状态,当他第二次收到FIN时,会响应一个RST(也是一种类型的TCP分节),会被服务器解释成一个错误。
为了TCP打算执行必要的工作以彻底终止某个连接两个方向上的数据流(即全双工关闭),那么他必须要正确处理连接终止四个分节中任何一个分节丢失的情况。
允许老的重复分节在网络中的消逝(为什么需要2MSL)
首先,存在这样的情况,某个路由器崩溃或者两个路由器之间的某个链接断开时,路由协议需要花费数秒到数分钟的时间才能稳定找出另一条通路。在这段时间内,可能发生路由循环(路由器A把分组发送给B,B又发送回给A),这种情况我们称之为迷途。假设迷途的分组是一个TCP分节,在迷途期间,发送端TCP超时并重传该分组,重传分组通过某路径到达目的地,而后不久(最多MSL秒)路由循环修复,早先迷失在这个循环中的分组最终也被送到目的地。这种分组被称之为重复分组或者漫游的重复分组,TCP必须要正确处理这些重复的分组。
我们假设ip1:port1和ip2:port2 之间有一个TCP连接。我们关闭了这个链接,过一段时间后在相同IP和端口之间建立了另一个连接。TCP必须防止来自之前那个连接的老的重复分组在新连接上出现。为了做到这一点,TCP将不复用处于TIME_WAIT状态的连接。2MSL的时间足以让某个方向上的分组存活MSL秒后被丢弃,另一个方向上的应答也最多存活MSL秒后被丢弃。
8.拥塞控制
https://www.cnblogs.com/czsy/p/10853295.html
9.应用层http协议
10.IO复用select/poll/epoll
11.libevent库
12.守护进程