0																			1																			2																			3

	0	1	2	3	4	5	6	7	8	9	0	1	2	3	4	5	6	7	8	9	0	1	2	3	4	5	6	7	8	9	0	1

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

|										Source	Port										|							Destination	Port								|

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

|																								Sequence	Number																								|

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

|																				Acknowledgment	Number																						|

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

|		Data	|											|U|A|P|R|S|F|																															|

|	Offset|	Reserved		|R|C|S|S|Y|I|												Window													|

|							|											|G|K|H|T|N|N|																															|

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

|											Checksum												|									Urgent	Pointer								|

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

|																				Options																				|				Padding				|

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

|																													data																														|

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
package	main

import	(

		"fmt"

		"net/http"

		"io/ioutil"

)

func	main()	{

		resp,	_	:=	http.Get("http://example.com")

		defer	resp.Body.Close()

		body,	_	:=	ioutil.ReadAll(resp.Body)

		fmt.Println(string(body))

}
#include	<stdio.h>

#include	<string.h>

#include	<unistd.h>

#include	<sys/types.h>

#include	<sys/socket.h>

#include	<netdb.h>

int

main(void)	{

		struct	addrinfo	hints,	*ai;

		int	soc,	n;

		char	requst[]	=	"GET	/	HTTP/1.0¥r¥n¥r¥n";

		char	buf[4096];

		memset(&hints,	0,	sizeof(hints));

		hints.ai_family	=	AF_INET;

		hints.ai_socktype	=	SOCK_STREAM;

		getaddrinfo("example.com",	"80",	&hints,	&ai);

		soc	=	socket(ai->ai_family,	ai->ai_socktype,	ai->ai_protocol);

								

		connect(soc,	ai->ai_addr,	ai->ai_addrlen);

								

		freeaddrinfo(ai);

		write(soc,	request,	strlen(request));

		while	(1)	{

				n	=	read(soc,	buf,	sizeof(buf));

				if	(n	<=	0)	{

						break;

				}

				printf("%*s",	n,	buf);

		}

		printf("¥n");

		return	0;

}
TCP/IPプロトコルスタック自作入門
TCP/IPプロトコルスタック自作入門
TCP/IPプロトコルスタック自作入門
TCP/IPプロトコルスタック自作入門
TCP/IPプロトコルスタック自作入門
TCP/IPプロトコルスタック自作入門
TCP/IPプロトコルスタック自作入門
TCP/IPプロトコルスタック自作入門
TCP/IPプロトコルスタック自作入門
TCP/IPプロトコルスタック自作入門
TCP/IPプロトコルスタック自作入門
TCP/IPプロトコルスタック自作入門
TCP/IPプロトコルスタック自作入門
TCP/IPプロトコルスタック自作入門
TCP/IPプロトコルスタック自作入門
TCP/IPプロトコルスタック自作入門
TCP/IPプロトコルスタック自作入門
TCP/IPプロトコルスタック自作入門
TCP/IPプロトコルスタック自作入門
TCP/IPプロトコルスタック自作入門
TCP/IPプロトコルスタック自作入門
TCP/IPプロトコルスタック自作入門
TCP/IPプロトコルスタック自作入門
TCP/IPプロトコルスタック自作入門
TCP/IPプロトコルスタック自作入門
TCP/IPプロトコルスタック自作入門

TCP/IPプロトコルスタック自作入門