http请求从TCP建立三次握手后进行,客户端按照规定的格式向服务器发送http请求,服务器在接收到这个请求之后,首先要对其进行解析,发掘出客户端所需要的相关资源,然后经过相应的业务逻辑处理,找到这个相应的资源,并将它以特定的形式返回给客户端。注意:不论是请求还是响应他都按照http协议的相关格式来进行,那都是比较通用的。
http的请求格式
http的请求格式主要包括这几部分:请求行、请求头、空行、消息体。具体结构如下图所示:
请求行:是指请求中的第一行,它主要有3部分构成:GET、POST等方法名,请求资源的URI,所用http的版本号。
请求头中的信息:有和缓存相关的信息和客户端身份(user-Agent)的信息。
消息体:是指客户端向服务器请求的数据资源,这部分数据不是每个请求所必有得。
http的响应格式
http的请求格式主要包括这几部分:响应行、响应头、空行、消息体。具体结构如下图所示:
响应行:它主要包含三部分内容:所使用的http版本号、状态码及状态说明。
响应头:响应头是服务器传递给客户端用于说明服务器的一些信息,以及将来继续访问该资源时的策略。
消息体:是指服务器向客户端回应的html文件,或者是其他形式的内容,如视频文件、图片等。
Socket
http页面请求的这一部分内容与Socket编程紧密相关,又称之为网络编程,网络协议通过一个叫做socket的对象抽象出来,socket可以建立网络连接,读数据,写数据。socket模块定义了一些常量参数,用来指定socket的的地址族、socket的类型、以及支持的TCP/IP协议。
socket.socket([family[, type[, proto]]]):根据指定的地址族和套接字类型、协议编号(默认为0)来创建套接字对象。AF_INET对应的IPV4, AF_INET6对应的IPV6。现在最常用的是IPV4协议。具体的参数分配如下图:
服务器端的编程(ser):
Socket :制定期望的通讯协议类型。AF_INET :IPV4,现在使用最多的。SOCK_STREAM :流式套接字。
Bind() ip: port:给套接口分配一个本地协议地址,对于TCP,调用函数bind可以制定一个端口号,用于标识某个计算机上的某个进程,它还可以指定一个IP地址
Listen:仅被TCP服务器调用,它是一个将调用connect发起连接的客户套接口,它指示内核指向此套接口的连接请求。该函数在accpect之前被调用。对于监听套接口,内核必须维护连个队列:未完成连接队列和已完成连接队列的状态。
Accept:从已完成连接队列头返回下一个已完成的连接,如果已完成的连接队列为空,则进入睡眠状态。如果accept执行成功,则代表与客户连接成功
Recv/read:接收客户端发来的信息。
Send/write:给客户端返回一个ok;
Close:关闭连接。
客户端cli:
Socket:制定期望的通讯协议类型。AF_INET :IPV4,现在使用最多的。SOCK_STREAM :流式套接字。
Connect:建立一个与服务器的链接。客户端在调用connect之前不必再调用bind,如果是tcp套接口的话,函数connect激发TCP的三次握手过程,且仅在连接建立成或错误时返回
Send:给客户端发送信息。只能说明成功地将数据写入发送缓冲区内,至于是否到达还不一定。
Recv:接收客户端发过来的ok.
Close:执行si'ci'hui'shou
Getsockname和getpeername返回与套接口有关的本地协议地址。Getsockname可用来获取某套接口的地址族。在不调用bind的客户机上,connect成功返回后,Getsocknam返回内核分配给此连接的本地端口号和IP地址。
三次握手
最初始客户机和服务器的Tcp进程他们都处于CLOSED状态,首先是B的TCP服务器进程先创建了传输控制块TCB,准备接受客户端的连接请求,然后B服务器进程端就处于LISTEN状态,等待客户端的连接请求。然后A的TCP客户进程也是首先创建了一个传输控制模块,然后向B发出连接请求报文段,报文段的首部同步位SYN=1,同时给自己设定一个初始量S,此时客户进程进入一个SEND状态即就是同步已发送状态。接着,B接收到A发出的连接请求以后, 同意连接建立,则需要向A发送一个确认。即把SYN和ACK都置为1,确认号为ack=S+1,同时还应发送一个自己的初始值假定为n,此时B进入同步收到状态。最后客户机A收到B的确认后,还应向B发出确认,将ACK置为1,另外将ack置为n+1,然后A将进入ESTABLISHED已建立连接状态。在B收到A的确认后,也进入ESTABLISHED状态。如下图所示:
四次挥手
A进程先向TCP发出一个连接释放报文段,并停止再发送数据,主动关闭TCP连接,需要将终止控制位FIN置为1,并设置它的初始值U,这时A进入终止等待1状态,等待B的确认。B收到链接释放报文段后立即发出确认,确认号ack=U+1,例外设置一个自己的初始值v,然后B就进入CLOSE-WAIT状态。当tcp通知高层应用程序后,然后A和B之间的连接就释放了,但是此时TCp处于半关闭状态,即A到B之间的连接释放了,但是B还可以向A发送数据,A收到B的确认后就进入终止等待2状态,等待B发出的连接释放报文段。假设B发出连接释放报文段,则要将终止控制位FIN置为1,同时发出确认号ack=u+1,还要再设置一个自己的初始值为W,然后B就进入了最后确认状态LAST-ACK,等待A的确认;A收到B的链接释放报文段后,向B发出确认,将ACK置为1,确认号置为W+1,然后A就进入TIME-WAIT时间等待状态。,当A等待上2MSL最长报文段寿命后,即4S进入CLOSED状态,才能开始下一个新连接的建立。