728x90
간단한 정리
11. 네트워크 프로그래밍
11.1 클라이언트 - 서버 프로그래밍 모델
- 모든 네트워크 응용 프로그램은 클라이언트 - 서버 모델에 기초하고 있다. 이 모델을 사용해서 응용은 한 개의 서버 프로세스와 한 개 이상의 클라이언트 프로세스로 구성된다. 서버는 일부 리소스를 관리하고, 이 리소스를 조작해서 클라이언트를 위한 일부 서비스를 제공한다.
- 클라이언트 - 서버 모델에서 근본적인 연산은 트랜잭션이다.
- 트랜잭션의 네 가지 단계
- 클라이언트가 서비스를 필요로 할 때, 클라이언트는 한 개의 요청(request)을 서버에 보내는 것으로 트랜잭션을 개시한다.
- 서버는 요청을 받고, 해석하고, 자신의 자원들을 적절한 방법으로 조작한다.
- 서버는 응답(response)을 클라이언트로 보내고, 그 후 다음 요청을 기다린다.
- 클라이언트는 응답을 받고 이것을 처리한다.
- 클라이언트와 서버는 프로세스이며 머신이나 호스트는 아니다. 하 개의 호스트는 서로 다른 많은 클라이언트와 서버를 동시에 실행할 수 있다.
11.2 네트워크
- 호스트에게 네트워크는 또 다른 I/O 디바이스이다. 네트워크에서 수신한 데이터는 I/O와 메모리버스를 거쳐서 어댑터에서 메모리로, 대개 DMA 전송으로 복사된다. 비슷하게 데이터는 메모리에서 네트워크로 복사 될 수 있다.
- 네트워크의 하위 수준은 LAN으로 가장 대중적인 LAN 기술은 이더넷이다.
- 이더넷 세그먼트는 몇개의 전선들과 허브라는 작은 상자로 구성된다. 전선의 한쪽 끝은 호스트의 어댑터에 연결되고, 다른 끝은 허브에 포트에 연결된다. 허브는 각 포트에서 수신한 모든 비트를 종속적으로 다른 모든 포트로 복사한다.
- 이더넷 어댑터는 고유한 48비트 주소를 갖는다. 호스트는 프레임이라고 부르는 비트들을 세그먼트의 다른 호스트로 보낼 수 있다. 각 프레임은 프레임이 소스와 목적지, 프레임의 길이를 식별할 수 있는 고정된 헤더 비트를 가지고 있으며, 그 뒤에 데이터 비트가 이어진다. 모든 호스트 어댑터는 이 프레임을 볼 수 있지만 목적지 호스트만이 실제로 이것을 읽어드린다.
- 다수의 비호환성 LAN들은 라우터라고 부르는 특별한 컴퓨터에 의해서 연결될 수 있으며, 라우터는 네트워크간 연결을 구성한다. 각 라우터는 이들이 연결되는 각 네트워크에 대해 어댑터(포트)를 가지고 있다.
- internet의 중요한 특성은 이것이 매우 다르고, 비호환적인 기술을 갖는 여러가지 LAN과 WAN들로 이루어져있다.
- 프로토콜은 두 가지 기본 기능을 제공한다.
- 명명법 : 프로토콜을 식별하고 분류하는데 사용되는 규칙 및 관습
- ex) IETF, IEEE, ISO ….
- 전달기법 : 서로 다른 네트워킹 기술은 서로 다른 비호환성을 갖는 비트인코딩 방법과 이들을 패키징하는 방법을 가지고 있다.
- 명명법 : 프로토콜을 식별하고 분류하는데 사용되는 규칙 및 관습
11.3 글로벌 IP 인터넷
- 각 인터넷 호스트는 TCP/IP 프로토콜을 구현한 소프트웨어를 실행한다. 인터넷 클라이언트와 서버는 소켓 인터페이스와 Unix I/O 함수들이 혼합을 사용해서 통신한다. 소켓 함수들은 일반적으로 시스템콜들로 구현되는데, 이 시스템 콜은 커널에서 트랩을 발생시키며, TCP/IP에서 다양한 커널 모드 함수들은 호출한다.
- TCP/IP는 실제로는 프로토콜의 집합으로 각각 서로 다른 기능을 제공한다.
- IP는 데이터그램을 한 인터넷호스트에서 다른 호스트로 보낼 수 있는 배달 메커니즘을 제공한다.
- IP의 특징
- Best-effort
- connectionless
- unreliable
- IP 패킷 헤더 내 수신 및 발신 주소를 포함한다.
- IPv4, IPv6, IP주소
- IP 헤더 내 바이트 전달 순서 : 최상위 바이트(MSB)를 먼저 보낸다 → Big-endian
- TCP는 IP위에 구현한 복잡한 프로토콜로 프로세스간 안전한 양방향 연결을 제공한다.
- TCP 특징
- reliable
- connection - oriented 연결 지향적 - 연결 관리를 위한 연결 설정 및 연결 해제가 필요하다.
- UDP는 전송 계층의 통신 프로토콜의 하나. 신뢰성이 낮은 프로토콜로써 완전성을 보증하지 않는다. 가상회선을 굳이 확립할 필요가 없고 유연하며, 효율적인 응용의 데이터 전송에 사용된다.
- UDP 특징
- Best-effort
- connectionless
- unreliable
- 실시간 응용 및 멀티캐스팅이 가능하다.
- 빠른 요청과 응답이 필요한 실시간 응용에 적합하다.
- 여러 다수 지점에 전송 가능하다.
- 헤더가 단순하다.
11.3.1 IP주소
- IP주소는 비부호형 32비트 정수다
- 인터넷 호스트들이 서로 다른 호스트 바이트 순서를 가질 수 있기 때문에 TCP/IP는 네트워크 패킷 헤더에 포함되는 IP주소 같은 모든 정수형 데이터 아이템에 대해서 통일된 네트워크 바이트 순서(빅엔디안)를 정의한다.
- IP 주소는 dotted-decimal 표기라고 하는 형식으로 제시되며, 이것은 각 바이트 십진수 값을 사용하고 다른 바이트들과는 점을 사용해서 구분한다.
11.3.2 인터넷 도메인 이름
- 인터넷 클라이언트와 서버는 서로 통신할 때 IP주소를 사용한다. 그렇지만 크기가 큰 정수는 사람들이 기억하기 어려워서 인터넷에서는 도메인 이름들의 집합을 IP주소 집합으로 매핑하는 메커니즘과 함께 사람들에게 친숙한 별도의 도메인 이름 집합을 정의한다.
- 도메인 이름들의 집합은 계층구조를 형성하고 있으며, 각각의 도메인 이름은 계층구조에서 자신의 위치를 인코드한다.
- 이 매핑은 DNS(Domain Name System)라고 하는 전세계에 분산된 데이터 베이스에 의해 관리되고 있다.
11.3.3 인터넷 연결
- 인터넷 클라이언트와 서버는 연결을 통해 바이트 스트림을 주고 받는 방식으로 통신한다. 이 연결은 두 개의 프로세스를 연결한다는 의미에서 point-to-point 연결이다. 데이터가 동시에 양방향으로 흐를 수 있다는 의미에서 완전양방향(full-duflex)이다. 그리고 소스프로세스가 보낸 바이트 스트림이 결국은 보낸 것과 동일한 순서로 목적지 프로세스에서 수신된다는 의미에서 안정적이다.
11.4 소켓 인터페이스
- 소켓 인터페이스는 네트워크 응용을 만들기 위한 UNIX I/O 함수들과 함께 사용되는 함수들의 집합이다.
- 듣기 식별자와 연결 식별자 사이의 구분은 많은 학생들을 혼란스럽게 한다. 듣기 식별자는 클라이언트 연결 요청에 대해 끝점으로서의 역할을 한다. 한번 생성되면, 서버가 살아있는 동안 계속 존재한다. 연결 식별자는 클라이언트와 서버 사이에 성립된 연결의 끝점이다. 이것은 서버가 연결 요청을 수락할 때마다 생성되며, 서버가 클라이언트에 서비스 하는 동안에만 존재한다.
11.5 웹서버
11.5.1 웹 기초
- 웹 클라이언트와 서버는 HTTP라고 하는 텍스트 기반 응용수준 프로토콜을 사용해서 상호 연동한다.
- 웹컨텐츠는 HTML언어로 작성 될 수 있다.
11.5.2 웹 컨텐츠
- 웹 클라이언트와 서버에게, 컨텐츠는 연관된 MIME타입을 갖는 바이트 배열이다.
- 웹서버는 두 가지 서로 다른 방법으로 클라이언트에게 컨텐츠를 제공한다.
- 디스크 파일 같은 정적 컨텐츠
- 실행 파일을 돌리고, 그 출력을 보내는 동적 컨텐츠
11.5.3 HTTP 트랜잭션
- HTTP 요청
- method/URI/version
- HTTP 응답
- version/status-code/status-message
백준
1654 랜선자르기
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
int k, n;
cin >> k >> n;
vector<unsigned int> arr(k);
unsigned int right = 0, left = 1, mid, ans = 0;
for (int i = 0; i < k; ++i)
{
unsigned int tmp;
cin >> tmp;
arr[i] = tmp;
right = max(right, tmp);
}
while (left <= right)
{
unsigned int check = 0;
mid = (right + left) / 2;
for (int i = 0; i < k; ++i)
check += arr[i] / mid;
if (check >= n)
{
left = mid + 1;
ans = max(mid, ans);
}
else
right = mid - 1;
}
cout << ans;
return 0;
}
- 이분 탐색을 사용해야 하는 문제
- 주어진 랜선중 가장 긴 크기가 right가 된다.
- 정답이 나와도 최대가 아닐 수 있기 때문에 최대를 구해야 한다.
728x90
'Study > TIL(Today I Learned)' 카테고리의 다른 글
24.02.28 운영체제, 백준 (1) | 2024.02.29 |
---|---|
24.02.27 퀴즈, 간단한 정리, 백준, KEYWORD (2) | 2024.02.28 |
24.02.25 운영체제, 백준, KEYWORD (2) | 2024.02.25 |
24.02.24 간단한 정리, 백준, KEYWORD (1) | 2024.02.25 |
24.02.23 CSAPP, 백준, KEYWORD (0) | 2024.02.24 |