교육/Network

네트워크 이론 2 & 네트워크 프로그래밍

솔♡ 2014. 6. 13. 12:34
랜카드의 고유번호만으로도 컴퓨터끼리의 통신이 가능하다
     -문제는 바로 코앞의 거리에 있어야만 가능

Domain     ┐
Name       ├ DNS
Service     ┘
Server



three way handshake (전송 제어 프로토콜)

TCP는 UDP와 달리 연결지향이라고 배웠었다. 그렇다면 연결지향이란 무엇을 의미하는것일까 ? 우리는 바로 위에서 TCP/IP 에 의해서 데이타가 어떻게 전송되어지는지를 알아봤는데, 데이타가 전송되기전에, Browser 와 Server 간의 연결을 성립하는 과정이 데이타를 전송하는 과정전에 이루어지게 된다. 연결을 만드는 과정은 이를테면 우리가 전화할때 어떤내용을 말하기에 앞서서, "안녕하세요 ?" "누구누구씨 맞아요?" "아, 네 저 누구누구 맞습니다"라고 상대편을 먼저 확인하는 과정과 동일한 과정이다.


즉 데이타가 전송되기 전에, 먼저 Browser 는 Server 에 "서버 잘있습니까?" 라고 메시지를 보내고, Server 는 다시 Browser(:12) 에게 "서버 준비되어 있으니, 데이타 보내시요" 라는 메시지를 보내고 Browser 는 다시 서버에게 "네, 그럼 지금부터 데이타를 보내겠습니다" 라고 서로 의 존재를 확인하는 절차를 수행한후, 정식 데이타를 교환하기 위한 통신선로를 개설하게 된다. 통신선로를 하나 만들기 위해서는 3번의 데이타 전송이 일어나게 되므로, 이것을 three way handshake이라고 한다. 위 그림은 three way handshake 의 과정을 보여주고 있다.




vi /usr/include/linux/socket.h (디파인된거 보기)
vi /usr/include/asm/socket.h







domain : 소켓이 사용되는 네트워크의 영역을 정의

 



AF_UNIX :: 유닉스 내부 프로토콜
AF_INET :: 가장 흔히 사용되는 ARPA 인터넷 프로토콜 (2byte short)
AF_ISO  :: 국제 표준 협회(international Standards Organization)프로토콜
/usr/include/Linux/socket.h라는 파일에 더 많은 도메인이 있습니다.

AF_INET(2byte)
port(2byte)
ip(4byte)
패딩(x) - 안쓰면서 용량만 차지




1. TCP 소켓
      * socket(AF_INET.SOCK_STREAM, IPPROTO_TCP)
        * 순차적 양방향 형의 소켓을 사용
2. UDT
     * socket(AF_INET,SOCK_DGRAM, IPPROTO_UDP)
       * 신뢰적이지 않는 접속
3.SOCK_RAW
       * 내부 네트워크 프로토콜 전용 (super user 전용)
4.SOCK_SEQPACKET
       * AF_NS 프로토콜에서 사용
 

socket 함수 반환 값.
  • 성공적으로 소켓을 만들면 0보다 큰 int값을 반환
  • 소켓지정번호, socket descriptor라고 부른다.
  • 소켓을 지시하며, 이를 이용해서 소켓을 제어한다.

 grep sockaddr_in /usr/include -r
     * /usr/include 의 위치에가서 하위 디렉토리 까지의 특정한 문자를 잡아내라는 명령

중괄호가 있는 것으로 보아서 빨간줄을 친것이 본진일 확률이크다.

다르게 찾아낸것들은 주석안에 있는경우와 다르게 쓰이는경우가 많음.


vi /usr/include/linux/in.h

115번째줄 port번호 - 2byte
116번째줄 addr - 4byte

119번째줄 = 배열 / 배열안에는 수학공식이다. (디파인되어있는)

--
                     isock = socket
                           ↑
보관용메모리    ←│ ip주소 port번호가 필요 (ip -ex.아파트위치 / TCP -ex.호실)
구조체(sockaddr) │ (이 중간 사이가 연결과정이다.) 
                           ↓
                      write(isock);

sockaddr - IPADDRESS와 PORT번호 저장하는 곳








htons() : (Host to network short)  

             Host 시스템에서 Network로 short 형 데이터를 보낼 때  바이트 오더를 바꾸어주는 함수

htonl() : (Host to network long )

            long 형 데이터의 바이트 오더를 바꾸어주는 함수

ntohs() : (Network to host short)

            Network에서 Host로 short형 데이터의 바이트 오더를 바꾸어주는 함수

ntohl()  : (Network to host long)

            long 형 데이터의 바이트 오더를 바꾸어주는 함수
----------------------------------------------------------------------------------------

리틀엔디안방식의 CPU와 빅엔디안 방식의 CPU는 메모리에 데이터를 저장하는 순서가 다릅니다.. 빅 엔디안은 바이트 열에서 가장 큰 값이, 리틀 엔디안은 바이트 열에서 가장 작은 값이 먼저 저장되구요..

네크워크시에는 빅엔디안을 표준으로 삼고 있습니다.. 그런데 우리가 주로 사용하는 인텔이나 AMD의 CPU는 리틀엔디안방식이기 때문에, 빅엔디안으로 바꿔줄 필요가 생깁니다..

이런 문제를 해결하는 것을 마샬링 또는 바이트순서를 맞춘다 라고 합니다.

그렇지만 하나하나 수동으로 바꾸는건 매우 귀찮으므로.. 변환하는 함수가 존재하는데,

그것이 위 코딩에 나와있는 htons, htonl등과 같은 함수입니다.

htonl은 host byte order to network byte order long,

htons는 host byte order to network byte order short,

ntohl은 network byte order to host byte order long,

ntohs은 network byte order to host byte order short

의 약자라고 볼수 있구요..

Host(사용자 컴퓨터에서 사용하는 엔디안)에서 Network(빅엔디안 방식)으로 바꾸어 주는 역할을 합니다.

Host가 빅엔디안 방식일 경우에 이 함수를 호출하면 아무런 변화가 없습니다..

즉 Host에 상관없이 사용하는게 좋다는 말이지요.

1234를 메모리에 저장하는 예를 보면, 빅 엔디안의 경우 1234의 순서로,

리틀 엔디안의 경우 4321의 순서로 저장됩니다.

엔디안이라는 말은 걸리버 여행기에서 유래했다고 합니다..