总结

TCP

TCP是一种面向连接的、可靠的基于字节流的传输层通信协议。TCP将用户数据打包成报文段,它发送后启动一个定时器,另一端收到的数据进行确认、对失序的数据重新排序、丢弃重复数据。

TCP的特点有:

1.TCP是面向连接的运输层协议
2.每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的
3.TCP提供可靠交付的服务
4.TCP提供全双工通信。数据在两个方向上独立的进行传输。因此,连接的每一端必须保持每个方向上的传输数据序号
5.面向字节流。面向字节流的含义:虽然应用程序和TCP交互是一次一个数据块,但TCP把应用程序交下来的数据仅仅是一连串的无结构的字节流

TCP三次握手:

TCP建立连接时,会有三次握手过程

第一次握手:客户端向服务器发送连接请求包,标志位SYN(同步序号)置为1,序号为X=0

第二次握手:服务器收到客户端发过来报文,由SYN=1知道客户端要求建立联机。向客户端发送一个SYN和ACK都置为1的TCP报文,设置初始序号Y=0,将确认序号设置为客户的序列号加1,即X+1=0+1=1

第三次握手:客户端收到服务器发来的包后检查确认序号是否正确,即第一次发送的序号加1。以及标志位ACK是否为1。若正确,服务器再次发送确认包,ACK的标志位为1,SYN标志位为0。确认序号=Y+1=0+1=1,发送序号为X+1=1。客户端收到后确认序号值与ACK=1则连接建立成功,可以传输数据了

HTTP的特性

简单快速:客户向服务器请求方法的时候,只要传送请求方法和路径;

灵活:HTTP允许传输任意类型的数据对象

无连接:在客户端与服务器交互完后,就断开连接,可以节省传输的时间

无状态:对事物的处理没有记忆能力,如果需要上一次的数据,需要重新上传

一个基于TCP的网络应用,server端事先在某个固定端口监听,由client主动发起连接,经过三次握手后建立连接。server端位于机器A,client端位于机器B。请问:
1.Server端能够建立的最大并发tcp连接数是多少?
2.Client端能够建立的最大并发tcp连接数输多少?
3.Linux操作系统中对每个进程能创建的文件句柄数有限制,请问怎么查看和修改这个权限?

如何标识一个TCP连接
在确定最大连接数之前,先来看看系统如何标识一个TCP连接。系统用一个四元组来唯一标识一个TCP连接:{local ip , local port , remote ip , remote port}

client最大tcp连接数
client每次发起tcp请求时,除非绑定端口,通常会让系统选取一个空闲的本地端口(local port),该端口是独占的,不能和其他tcp连接共享。tcp端口的数据类型是unsigned short,因此本地端口个数最大只有65536,端口0有特殊含义,不能使用,这样可用端口最多只有65535,所以在全部作为client端的情况下,最大tcp连接数为65535,这些连接可以连到
不同的server ip。

server最大tcp连接数
server通常固定在某个本地端口上监听,等待client的连接请求。不考虑地址重用的情况下,即使server端有多个ip,本地监听端口也是独占的,因此server端tcp连接四元组中只有remote ip(也就是client ip)和remote port(客户端port)是可变的,因此最大tcp连接为客户端ip数 * 客户端port数 * 客户端port数,对IPV4,不考虑ip地址分类因素,最大tcp连接数约为2的32次方(ip数)* 2的16次方(port数),也就是server端单机最大tcp连接数约为2的48次方。

修改linux系统的最大文件句柄数限制的方法:

1.ulimit -n 65535
在当前session有效,用户退出或者系统重新启动后恢复默认值

2.修改profile文件:在profile文件中添加:ulimit -n 65535
只对当个用户有效

3.修改文件:/etc/security/limits.conf,在文件中添加(立即生效-当前session中运行ulimit -a命令无法显示)

* soft nofile 32768 #限制单个进程最大文件句柄数(到达此限制时系统报警)
* hard nofile 65536 #限制单个进程最大文件句柄数(到达此限制时系统报错)

4.修改文件:/etc/sysctl.conf。在文件中添加:

fs.file-max=655350 #限制整个系统最大文件句柄数

运行命令:/sbin/sysctl -p 使配置生效

有一个链表知道头指针,请将这个链表倒过来
在数据库中,左联和右联的区别。
如果只知道一个链表的头指针,请求出他的倒数第n个元素

头指针与头结点我的异同点:
头指针:
头指针是指链表指向第一个结点的指针,若链表有头结点,则是指向头节点的指针;
头指针具有标识作用,所以常以头指针冠以链表的名字;
无论链表是否为空,头指针均不为空。头指针是链表的必要元素。

头结点:
头结点是为了操作的统一和方便而设立的,放在第一元素的节点之前,其数据域一般无意义(也可存放链表的长度);
有了头结点,对在第一元素节点前插入节点和删除第一节点,其操作与其他节点的操作就统一了;
头结点一般不是链表的必要元素。
head是头指针,必须要有,指示链表的头;
头结点不是必须的。

头指针和头结点

头指针是指链表的第一个存储元素和下一个节点地址的节点。而头结点是指存储链表信息和头指针的节点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值