최코딩의 개발

[컴퓨터 네트워크] 13주차 본문

네트워크

[컴퓨터 네트워크] 13주차

seung_ho_choi.s 2023. 12. 4. 23:23
728x90

13-1

 

토큰과 동기점 

- 논리적으로 큰 파일을 작은 단위로 나누는 과정 = 동기점을 부여하는 것

- 즉 큰 파일을 물리적으로 나누지 않고 파일을 전송하는 중간중간에 동기점을 부여함으로써 송수신 프로세스가 해당 위치

까지는 데이터 전송이 완료되었다는 것에 합의할 수 있음 

 

재동기 기능

- 동기점은 데이터를 전송할 때 특정 지점에서 복구할 수 있도록 통신 양단 간의 합의로 지정 

- 즉 세션 계층의 상위 계층에는 적절한 구간으로 나뉜 지점에 동기점을 부여하고 오류가 발생하면 해당 지점으로 돌아가 복구하는 기능이 구현되어야 함  

 

SSO(single sign one)

- 가장 기본적인 인증 시스템 

- 모든 인증을 하나의 시스템에서 라는 목적으로 개발 

- 시스템이 몇 대라도 한 시스템의 인증에 성공하면 다른 시스템의 접근 권한을 모두 얻는것 

- 약점이 있다.. 최초 인증 과정을 통과하면 모든 서버나 사이트에 접속할 수 있는 단일 장애점이 약점.. 

- 그래서 약점을 보완하기 위해 중요정보에 접근할 때는 저속적인 인증을 하도록 되어 있음 

 

표현 계층 

 

데이터의 압축 

- 전송 데이터 양이 많으면 그대로 송신하는 것보다 원래 의미를 유지하는 범위 내에서 크기를 줄이는 것이 효율적 

- 표현 계층은 이를 위해 압축 기능을 수행 또한 암호화 기능도 표현 계층에 해당 

 

비손실 압축

- 압축 과정에서 원래 데이터의 내용을 분실하지 않음 즉 압축 해제를 통해 얻은 데이터가 압축 이전의 데이터와 완전히 동일 

 

손실 압축

- 압축 해제한 데이터가 원래 데이터와 동일하지 않음 

- 즉 원래 데이터를 완전히 복원할 수 없음 이것을 사용하는 이유는 압축 데이터의 크기가 비손실 압축보다 작기 때문.. 예시는 이미지나 영상 등 

 

응용 계층 

 

동시성 제어 

- 동시성은 임의의 동작이 외형상 동시에 진행되는 것처럼 보이는 것

- 즉 여러 동작의 선후 진행 속도에 상관없이 동시에 실행되어도 각 실행 결과가 항상 같은 결과를 제공하도록 해줌 

- 다시 말해서 독립적으로 실행되는 프로세스의 실행 순서가 결과에 영향을 주지 않음 

- 예로 들면 A가 어떤 글을 2로 변경하면 B와 C도 모두 2로 봐야된다. 그것이다. 

 

 

 

13-2

 

 

- 동작원리는 알고있자.

 

MIME 

- 에전에는 텍스트파일을 주고받은 아스키코드로 공통된 표준에 따르기만해서 문제가 없었다.

- 하지만 네트워크를 통해 아스키코드 파일이 아닌 바이너리 파일을 보내는 경우가 종종 생긴다.(바이너리는 음악,무비,워드 파일 등 )

- 그래서 이런 바이너리 파일들을 기존의 시스템에서 문제없이 전달하기 위해서 텍스트파일로 변환이 필요했다. 

- 즉 멀티미디어 데이터를 보내기위해 하는 방법이다.

 

인코딩: 바이너리 파일에서 텍스트 파일로 변환

디코딩: 텍스트 파일에서 바이너리 파일로 변환 

 

상태코드

 

 

13-3

 

소켓

 

함수 7가지 

socket(int domain, int type, int protocol)

- 소캣을 생성하는 함수이다.

- 1P는 아이피 지정

- 2P는 소켓의 타입을 지정 즉 연결지향이냐 비연결 지향이냐.

- 3P는 프로토콜 번호를 지정 


bind(int s, const struct sockaddr *name, socklen_t *namelen)

- 소켓에 주소를 할당하는 함수이다. 즉 IP를 묶어서 소켓에 보내는 과정 

- 1P는 소켓 디스크립터 

- 2P/3P는 할당할 주소 정보간 담긴 구조체와 구조체의 크기 

 

listen(int s, int backlog)

- 연결을 수신할 수 있도록 소켓을 대기 상태로 설정하는 함수 

- 2P는 대기 큐의 크기를 지정 

 

accept(int s, struct sockaddr *addr, socklen_t *addrlen)

- 클라이언트의 연결을 수락하고 새로운 소켓을 생성하여 반환

 

connect(int s, const struct sockaddr *name, socklen_t namelen)

- 클라이언트가 서버에 연결하는 함수 

 

send(int s, const void *msg, size_t len, int flags)

- 소켓을 통해 데이터를 전달하는 함수(전송)

- 4P는 전송에 대한 특별한 옵션을 지정 


recv(int s, void *buf, size_t len, int flags)
- 소켓으로부터 데이터를 수신하는 함수이다.(수신) 

 

소켓통신


from socket import *
from Crypto.Cipher import DES
from Crypto.Hash import SHA256 as SHA
import binascii

keytext = "anyang"
hash = SHA.new()
hash.update(keytext.encode('utf-8'))
# keytext를 해시화했을 때 첫 8byte를 key로 함
key = hash.digest()
key = key[:8]

serverSock = socket(AF_INET, SOCK_STREAM)
serverSock.bind(('', 8081))
serverSock.listen(1)

connectionSock, addr = serverSock.accept()

print(str(addr),'에서 접속이 확인되었습니다.')

data = connectionSock.recv(1024)

des = DES.new(key, DES.MODE_ECB)
plain_text = 'I am a server.'
while(len(plain_text) % 8 != 0):
    plain_text += ' '
encrypt_text = des.encrypt(plain_text.encode())
encrypt_string = binascii.hexlify(encrypt_text)
print(encrypt_string)

print('받은 데이터 : ', data.decode('utf-8'))

connectionSock.send(encrypt_string)
print('메시지를 보냈습니다.')

 

서버 


from socket import *
from Crypto.Cipher import DES
from Crypto.Hash import SHA256 as SHA
import binascii

keytext = "anyang"
hash = SHA.new()
hash.update(keytext.encode('utf-8'))
# keytext를 해시화했을 때 첫 8byte를 key로 함
key = hash.digest()
key = key[:8]

clientSock = socket(AF_INET, SOCK_STREAM)
clientSock.connect(('127.0.0.1', 8081))

print('연결 확인 됐습니다.')
clientSock.send('I am a client'.encode('utf-8'))

print('메시지를 전송했습니다.')

encrypt_string = clientSock.recv(1024)

des = DES.new(key, DES.MODE_ECB)
descrypt_data = binascii.unhexlify(encrypt_string)
descrypt_text = des.decrypt(descrypt_data)

print('받은 데이터 : ', descrypt_text.decode('utf-8'))

 

클라이언트 

 


from Crypto.Cipher import DES
from Crypto.Hash import SHA256 as SHA
import binascii

keytext = "anyang"
hash = SHA.new()
hash.update(keytext.encode('utf-8'))
# keytext를 해시화했을 때 첫 8byte를 key로 함
key = hash.digest()
key = key[:8]

des = DES.new(key, DES.MODE_ECB)
plain_text = 'I am a server.'
while(len(plain_text) % 8 != 0):
    plain_text += ' '

################################# 암호화
encrypt_text = des.encrypt(plain_text.encode())
encrypt_string = binascii.hexlify(encrypt_text)
print(encrypt_string)

################################# 복호화
descrypt_data = binascii.unhexlify(encrypt_string)
descrypt_text = des.decrypt(descrypt_data)
print(descrypt_text)

 

암호화 

728x90

'네트워크' 카테고리의 다른 글

[컴퓨터 네트워크] 14주차  (1) 2023.12.07
[컴퓨터 네트워크] 12주차  (2) 2023.12.04
[컴퓨터 네트워크] 11주차  (2) 2023.12.03
[컴퓨터 네트워크] 10주차  (1) 2023.12.03
[컴퓨터 네트워크] 9주차  (1) 2023.12.02