2020-09-29 TIL
character stream
- printwriter가 char stream을 전송할 때 flush()를 호출해야 한다.
- byte stream은 flush()가 없어도 된다.
- 헷갈린다면 무조건 flush()를 호출한다.
TCP / UDP
- https://simhyejin.github.io/2016/07/04/connectionoriented-connectionless/
- connectionfull - stateful / stateless
stateful
- stateful 방식 => 서버와 연결한 후, 클라이언트에서 연결을 끊을 때까지 계속해서 연결을 유지하며 클라이언트 요청을 처리한다. => 단점:
- 한 번 연결하면 클라이언트가 연결을 끊을 때까지 계속 유지한다.
- 클라이언트가 작업을 요청하지 않더라도 계속 서버에 연결정보를 계속 유지하기 때문에 서버 메모리를 많이 차지하고 동시에 많은 클라이언트의 요청을 처리하기 힘들다.
- 만약 서버가 순차적으로 클라이언트와 연결을 수행한다면 이전에 연결했던 클라이언트가 연결을 끊기 전까지는 다음 클라이언트와 연결되지 못하는 문제가 있다. => 장점:
- 한 번 서버에 연결되면 클라이언트가 연결을 끊을 때까지 유지되기 때문에 요청할 때 마다 매번 연결 작업을 수행할 필요가 없다.
- 따라서 요청에 대한 응답이 빠르다.
- 또한 연결된 상태에서 수행한 작업 정보를 서버에 유지할 수 있어 영속성이 필요한 작업을 처리하는데 유리하다. => 작업 시간:
- = 데이터 전송 시간 + 작업 처리 시간 + 데이터 수신 시간
- 즉 작업을 요청할 때마다 연결할 필요가 없기 때문에 연결하는데 시간이 걸리지 않는다.
=> 대표적인 예:
- 게임 서버 연결: 서버에 한 번 연결되면 게임을 마칠 때까지 데이터를 주고 받는다.
- 화상 통신: 한 번 연결하면 연결을 끊을 때까지 데이터를 주고 받는다.
- 채팅 서버: 전용 클라이언트를 이용한 채팅
- 텔렛: 원격 제어 프로그램
- FTP: 파일 전송 프로그램
- 오프라인 예: 건강보험문의, 상담 등
=> 통신 클라이언트 서버 |——————>| 연결 |——————>| 데이터 수신 |<——————| 데이터 전송 |——————>| 데이터 수신 |<——————| 데이터 전송 |——————>| 데이터 수신 |<——————| 데이터 전송 |——–X———>| 끊기
- 즉 한 번 연결하면 연결을 끊을 때까지 계속 데이터를 주고 받는다.
# stateless
- stateless => 서버에 작업을 요청할 때 연결하고, 서버로부터 응답을 받으면 연결을 끊는다. => 즉 요청/응답을 한 번만 수행한다. => 단점:
- 요청할 때마다 매번 서버에 연결해야 하기 때문에 실행 시간이 많이 걸린다.
- 실행시간 = 연결하는데 걸린 시간 + 데이터 전송 시간 + 작업 처리 시간 + 데이터 수신 시간
- 서버와 연결할 때, 사용자 인증(authentication; 아이디, 암호 유효 여부 검사)이나 사용권한 확인(authorization; 사용자에게 허락된 작업 범위를 확인) 같은 작업을 반드시 수행하는 경우 연결하는데 더더욱 많은 시간이 걸린다. => 장점:
- 서버에 계속 연결된 상태가 아니기 때문에 서버 입장에서는 메모리를 많이 사용하지 않는다.
- 왜? 클라이언트와 연결을 계속 유지하지 않기 때문에 작업을 처리하는 동안만 연결정보를 유지한다. 그래서 같은 메모리라도 stateful 방식 보다는 더 많은 클라이언트의 요청을 처리할 수 있다. => 대표적인 예:
- HTTP 통신: 웹브라우저가 서버에 연결한 후 요청을 하고 서버가 응답한 후 연결을 끊는다.
- 메신저: 메신저 서버에 연결하고 메시지 전송 후 연결 끊는다.
- 메일 전송: 메일서버에 데이터 전송 후 연결 끊는다.
- 오프라인 예: 114 안내, 배달 등
=> 통신 클라이언트 서버 |——————>| 연결 |——————>| 데이터 수신 |<——————| 데이터 전송 |——–X———>| 끊기 |——————>| 연결 |——————>| 데이터 수신 |<——————| 데이터 전송 |——–X———>| 끊기 |——————>| 연결 |——————>| 데이터 수신 |<——————| 데이터 전송 |——–X———>| 끊기
- 서버에 요청할 때 마다 연결하고 응답을 받으면 즉시 연결을 끊는다.
- 따라서 비영속적인 단일 작업을 처리할 때 적합한 통신 방식이다.