(전체적인 PC , HUB , SERVER의 모습)
PC는 자동으로 IP Address가 설정된 모습을 볼 수 있다.
DHCP Server에는 IP를 동적으로 직접 할당해 주었다.

 

DHCP 설정

1.     DHCP Client Discover 패킷을 구성하여 DHCP Server에 보냄.
이는 HostDHCP Server를 찾기 위한 통신이며 브로드캐스팅 통신을 이용한다.
(
동일 Subnet에 브로드캐스팅)

 

이때 ARP TypeICMP Type 두개의 패킷이 만들어지는데,

ICMPTCP/IP에서 IP 패킷을 처리할 때 발생되는 문제를 알려주는 프로토콜이다.

ARP 는 네트워크 상에서 IP 주소를 물리적 네트워크로 대응 시키기 위해 사용되는 프로토콜이다.

ARP는 상대방 호스트의 MAC 어드레스를 알아내기 위해 PC에게 보내게 된다.

 

YOUR CLIENT ADDRESS:0.0.0.0이라고 나오는 것으로 보아 아직 IP 주소가 없는 것으로 예상된다.

2.    DHCP 서버는 Host에게 자신의 존재를 알리고, 할당할 IP 주소 정보를 Offer 패킷에 구성하여 DHCP Client에게 보내고, DHCP Client는 이를 수신하여 Request 패킷에 사용할 네트워크의 정보를 DHCP Server에게 요청한다.

YOUR CLIENT ADDRESS:10.0.0.2 으로 변경된 것으로 보아 단말에 할당할 IP 주소를 의미하는 것 같다.

3.     DHCP ServerDHCP Request 패킷을 받는다.

DHCP 서버는 요청된 IP 주소를 호스트의 MAC 주소로 바인딩 한다.

이후 DHCP ServerAck 패킷으로 네트워크 정보를 담아 Host(DHCP Client)에게 전달한다.

4.    DHCP ClientDHCP Ack 패킷을 전달받는다.

Ack 메시지를 수신한 HostIP 주소를 포함한 네트워크 정보를 획득하였기 때문에

IP 주소 구성을 설정하고, 인터넷을 사용할 수 있게 된다.

 

DHCP에서 모든 연결 방식은  Broadcast 방식을 사용하였다.

또한 DHCP패킷 필드를 살펴보면 Client IP Address, Your IP Address, Server IP Address, Gateway IP Address, DHCP option 등 여러 필드가 있는 것을 확인할 수 있다.

'Data Communication' 카테고리의 다른 글

이더리움 지갑 Coding  (0) 2019.11.04
DNS Query  (0) 2019.10.14
Web Socket  (0) 2019.10.10
데이터통신 python - TCP 통신  (0) 2019.10.08
데이터통신 python - UDP 통신  (0) 2019.10.07

<CODE>

pragma solidity ^0.4.24;

 

contract test5 {

  

    mapping(string => uint256) balance;

    function regUser(string name, uint256 bal) public {

        balance[name] += bal;

    }

    function checkBal(string name) public view returns(uint256){

        return balance[name];

    }

   

    function transfer(string fromWhom, string toWhom, uint256 coins) public {

        balance[fromWhom] -= coins;

        balance[toWhom] += coins;

    }

}

 

<실행 화면>

<화면 전체>

<과정>

1.     registerUser를 통해 “Kim” 사용자와 100원을 등록한다.

2.     CheckMoney“Kim”을 입력해 금액이 정상적으로 확인되는지 확인한다.

3.     registerUser를 통해 “Lee” 사용자와 100원을 등록한다.

4.     Transfer를 통해 “Kim”“Lee” 사용자에게 100원을 전달한다.

5.     CheckMoney“Lee”를 입력해 “Lee”의 금액이 200원임을 확인하면 실습 완료.

'Data Communication' 카테고리의 다른 글

DHCP  (0) 2019.11.06
DNS Query  (0) 2019.10.14
Web Socket  (0) 2019.10.10
데이터통신 python - TCP 통신  (0) 2019.10.08
데이터통신 python - UDP 통신  (0) 2019.10.07

패킷트레이서를 통해 위와 같이 2개의 서버와 1개의 pc로 구성.

 

PC의 ip 설정
DNS Server의 IP 설정
Server의 IP 설정

 

DNS Server - A Record 설정

 

pc에 DNS 주소 insert

 

<Analysis>

 

1) DNS 클라이언트가 DNS 쿼리를 Server로 보낸다.
1) DNS Server가 PC가 보낸 DNS Query를 받음.

 

1) DNS 클라이언트는 DNS의 응답을 받는다.          2)수신된 응답에는 도메인의 IP 주소가 있다.    3)HTTP 클라이언트는 HTTP 서버에 연결한다. (TCP)

 

1)TCP 통신에 성공.                                             2)PC의 HTTP 클라이언트는 서버에 HTTP 요청을 보냄.

 

1)HTTP Server가 요청을 받음.
1)HTTP 클라이언트는 서버로부터 응답을 받고, 웹 브라우저에 페이지가 표시됨.

'Data Communication' 카테고리의 다른 글

DHCP  (0) 2019.11.06
이더리움 지갑 Coding  (0) 2019.11.04
Web Socket  (0) 2019.10.10
데이터통신 python - TCP 통신  (0) 2019.10.08
데이터통신 python - UDP 통신  (0) 2019.10.07

web socket으로 hello 메세지 출력하기

 

웹 소켓 열 때 필요한 정보가 어떤 것들이 HTTP로 전달되는지 그리고 웹소켓 연결을 위해 HTTP가 어떻게 동작하는가?

HTTP에서 WebSocket으로의 프로토콜 전환을 WebSocket HandShake라고 한다.

브라우저는 프로토콜을 HTTP -> WebSocket으로 전환하려는 요청을 헤더에 Upgrade 헤더를 추가해 서버로 보낸다.

이 요청을 받은 서버는 Upgrade 속성을 통해 WebSocket으로 프로토콜 전환을 하게 된다.

WebSocketws프로토콜을 사용하는데, HTTP 연결이 중단되고 ws프로토콜로 연결이 전환되면 동일한 TCP/IP 연결을 통해 WebSocket 연결로 대체된다.

 

WebSocket은 클라이언트와 서버가 연결되어 있어 실시간 통신이 가능하기 때문에 실시간 채팅, 주식 등 실시간 정보가 필요한 서비스에 주로 활용된다.

WebSocketHTTP와 달리 상태를 유지하기 때문에 서버와 클라이언트는 항상 연결을 유지해야 하는데, 이로 인해 부하가 발생할 수 있고 비정상적으로 연결이 해제되었을 때 적절한 대처에 대한 방법이 필요하다.

 

웹소켓에서 데이터 hello 메시지를 전달하기 위한 헤더 정보들은?

클라이언트 요청 헤더

Get / HTTP/1.1/r/n : 요청 메서드와 요청 파일정보,. HTTP 버전을 의미

Host : 서버의 도메인 네임으로 Host 헤더는 반드시 존재해야 한다.

User-Agent : 사용자가 어떤 클라이언트를 통해 요청을 보냈는지 알 수 있다.

Windows 10 64bit Chrome을 이용해 접속했음을 알 수 있다.

이를 활용해 접속자 및 사용기기 통계를 낼 수 있다고 함.

Origin: 요청을 보낼 때, 요청이 어느 주소에서 시작되었는지 나타낸다.

Connection: 클라이언트와 서버가 connection에 대한 옵션을 정할 수 있게 알려줌.

Cache-Control: 메시지와 함께 캐시 지시자를 전달하기 위해 사용하는 헤더이다.

Upgrade: websocket이라는 단어를 꼭 사용해야 한다. (이유는 WebSocket 연결 과정에 서술)

Sec-WebSicjet-Key: 유효한 요청인지를 확인하기 위한 키로 base64로 인코딩한다.

 

서버 응답 헤더

Connection: 클라이언트와 서버가 connection에 대한 옵션을 정할 수 있게 알려줌. Upgrade가 반드시 포함되어야 함

Date: HTTP 메시지를 생성한 일시를 나타냄.

Sec-WebSkcoet-Accept: 클라이언트로부터 받은 Sec-WebSocket-Key를 사용하여 계산된 값               

Server: 서버 소프트웨어 정보를 나타냄.

Access-Control-Allow-Credentials:클라이언트 요청이 쿠키를 통해서 자격 증명을 해야 하는 경우에 true를 응답받은 클라이언트는 실제 요청 시 서버에서 정의된 규격의 인증값이 담긴 쿠키를 함께 보내야 한다.

Access-Control-Allow-Headers: 요청을 허용하는 헤더.

Upgrade: websocket이라는 단어를 꼭 사용해야함. (이유는 WebSocket 연결 과정 서술)

 

'Data Communication' 카테고리의 다른 글

DHCP  (0) 2019.11.06
이더리움 지갑 Coding  (0) 2019.11.04
DNS Query  (0) 2019.10.14
데이터통신 python - TCP 통신  (0) 2019.10.08
데이터통신 python - UDP 통신  (0) 2019.10.07

TCP 통신

 

-Client

 

-Server

 

 

-Result

TCP Server

from socket import * #socket과 관련 함수를 사용하기 위해 socket import 해준다.

serverPort = 12000

serverSocket = socket(AF_INET,SOCK_STREAM) #socket을 생성하는 부분에서 SOCK_DGRAM을 사용하던 UDP 방식과는 달리 SOCK_STREAM이라는 TCP 방식을 사용했음을 알 수 있다.

serverSocket.bind(('',serverPort)) #bind()를 통해 port를 열어준다.

serverSocket.listen(1) #listen 메서드는 한번에 연결할 수 있는 사용자의 수를 의미하는데, 여기서는 한번에 1명의 사용자를 연결할 수 있다.

print ('The server is ready to receive')

while True:

     connectionSocket, addr = serverSocket.accept() #accept()메서드는 실행하면 연결 요청이 있을 때까지 대기상태로 진입하며, 연결에 성공하게 되면 Client의 정보를 반환한다.

     sentence = connectionSocket.recv(1024).decode() #UDP 방식과는 다르게 recv(), 만 입력하고 있는데, 이미 accept에서 받은 client에 대한 정보가 다 들어있기 때문이다.

     capitalizedSentence = sentence.upper()

     connectionSocket.send(capitalizedSentence.

                                                            encode())

     connectionSocket.close()  #UDP 방식과는 다르게 send()만 입력하고 있는데, 이미 accept에서 받은 client에 대한 정보가 다 들어있기 때문이다.

 

 

 

 

 

 

TCP Client

from socket import * #socket과 관련 함수를 사용하기 위해 socket import 해준다.

serverName = 'localhost'

serverPort = 12000

clientSocket = socket(AF_INET, SOCK_STREAM) #server와 마찬가지로 socket을 생성해준다. (여기서도 SOCK_STREAM을 확인한다.)

clientSocket.connect((serverName,serverPort)) #Client의 연결 요청은 connect() 메서드로 한다. 첫번째 인자로 서버의 이름, 두번째 인자로 포트번호를 입력한다. -accept()메서드에서 연결 요청을 받기 때문이다.

sentence = input('Input lowercase sentence:')

clientSocket.send(sentence.encode()) #send()

modifiedSentence = clientSocket.recv(1024) #recv()

print ('From Server:', modifiedSentence.decode()) #받은 메세지를 출력해주고 싶으면 decode()를 통해 decoding 해주어야 한다.

clientSocket.close()

 

 

 

 

 

 

 

 

 

 

'Data Communication' 카테고리의 다른 글

DHCP  (0) 2019.11.06
이더리움 지갑 Coding  (0) 2019.11.04
DNS Query  (0) 2019.10.14
Web Socket  (0) 2019.10.10
데이터통신 python - UDP 통신  (0) 2019.10.07

udp_tcp.docx
0.10MB

 

UDP 통신

 

-Client

-Server

-Result

UDP Server

from socket import * #socket과 관련 함수를 사용하기 위해 socket import 해준다.

serverPort = 65001

serverSocket = socket(AF_INET, SOCK_DGRAM) #소켓을 생성한다. (소켓 관련한 프로그래밍에서는 socket 객체를 이용하기 때문에 socket.을 해주고 있다. AF_INET IPv4, SOCK_DGRAM UDP 통신 방식을 사용함을 의미한다. )

serverSocket.bind(('175.214.60.124', serverPort)) #통신을 위해 bind를 통해 port를 열어준다. 첫번째 인자는 ip를 문자열 형태로 , 두번째 인자는 포트 번호를 입력한다.

print ('The server is ready to receive')

while True:

    message, clientAddress = serverSocket.recvfrom(2048) #클라이언트로 부터 문자열을 전달 받기위해 recvfrom을 한다.

    modifiedMessage = message.decode().upper() #Client에서 문자데이터를 보낸다면 bytes type으로 메시지가 오게 되는데 받은 메시지를 파이선에서 출력하고 싶다면 받은문자열.decode()를 통해 decoding 해주어야함

    serverSocket.sendto(modifiedMessage.encode(),

clientAddress) #보낼 문자열이 있다면 보낼 문자열.encoding()을 해주어야 한다.

UDP 통신처럼 연결하지 않은 상태에서 메시지를 전송하거나 수신할 때 sendto 함수와 recvfrom 함수를 사용한다.

 

 

 

 

 

 

UDP Client

from socket import *

serverPort = 65001

serverSocket = socket(AF_INET, SOCK_DGRAM) #server와 마찬가지로 socket을 생성해준다.

serverSocket.bind(('175.214.60.124', serverPort)) #통신을 위해서 bind. (Client에서는 굳이 만들 필요가 없다고 한다. 임의로 port 번호가 생성된다.)

print ('The server is ready to receive')

while True:

    message, clientAddress = serverSocket.recvfrom(2048) #서버로부터 문자열을 받기 위해 recvfrom을 한다.

    modifiedMessage = message.decode().upper()

    serverSocket.sendto(modifiedMessage.encode(),

                                      clientAddress) #sendto를 통해 server에서 받은 글자를 upper() server에 대문자로 메시지를 보내준다.

 

 

 

 

 

 

 

 

 

 

'Data Communication' 카테고리의 다른 글

DHCP  (0) 2019.11.06
이더리움 지갑 Coding  (0) 2019.11.04
DNS Query  (0) 2019.10.14
Web Socket  (0) 2019.10.10
데이터통신 python - TCP 통신  (0) 2019.10.08

+ Recent posts